on d075d2b help sign in
.github/FUNDING.ymldeleted−1
since splitsnapshots
unifiedsplit
@@ -1 +0,0 @@
1−github: [sharkdp, keith-hall, Enselic]
.github/ISSUE_TEMPLATE/bug_report.md+15−40
@@ -8,57 +8,32 @@ assignees: ''
8---
8---
9
9
10<!--
10<!--
11+Hey there, thanks for creating an issue!
11
12
12−Hey there, thank you for reporting a bug!
13+In order to reproduce your issue, we might need to know a little bit more about the environment
14+which you're running `bat` on.
13
15
14−Please note that the following bugs have already been reported:
16+If you're on Linux or MacOS:
15−
16−* dpkg: error processing archive /some/path/some-program.deb (--unpack):
17− trying to overwrite '/usr/.crates2.json'
18−
19− See https://github.com/sharkdp/bat/issues/938
17+ Please run the script at https://github.com/sharkdp/bat/blob/master/diagnostics/info.sh and
18+ paste the output at the bottom of the bug report.
20
19
20+If you're on Windows:
21+ Please tell us about your Windows Version (e.g. "Windows 10 1908") at the
22+ bottom of the bug report.
21-->
23-->
22
24
23−**What steps will reproduce the bug?**
25+**What version of `bat` are you using?**
24−
26+[paste the output of `bat --version` here]
25−1. step 1
26−2. step 2
27−3. ...
28−
29−**What happens?**
30
27
28+**Describe the bug you encountered:**
31...
29...
32
30
33−**What did you expect to happen instead?**
31+**Describe what you expected to happen?**
34−
35...
32...
36
33
37−
38**How did you install `bat`?**
34**How did you install `bat`?**
39−
40−<!-- apt-get, homebrew, GitHub release, etc. -->
35+apt-get, homebrew, GitHub release, etc.
41
36
42---
37---
43
38
44−**bat version and environment**
39+[paste the output of `info.sh` here]
45−
46−<!--
47−In order to reproduce your issue, please add some information about the environment
48−in which you're running bat. To do this, run the full `bat` command that demonstrates
49−the bug, and attach the `--diagnostic` option:
50−
51− bat [other options and arguments…] --diagnostic
52−
53−Finally, paste the Markdown output here. Please make sure that it does not reveal any
54−personal information.
55−
56−
57−If you are running bat 0.17.1 or older (where --diagnostic is not available), please
58−run the script at
59−
60− https://github.com/sharkdp/bat/blob/master/diagnostics/info.sh
61−
62−(click "Raw" to get the actual source code) and paste the Markdown output here. If you
63−are on Windows, please let us know your bat version and your Windows version.
64−-->
.github/ISSUE_TEMPLATE/config.yml+1
@@ -1 +1,2 @@
1blank_issues_enabled: true
1blank_issues_enabled: true
2+
.github/ISSUE_TEMPLATE/feature_request.md+1
@@ -7,3 +7,4 @@ assignees: ''
7
7
8---
8---
9
9
10+
.github/ISSUE_TEMPLATE/question.md+1−2
@@ -7,5 +7,4 @@ assignees: ''
7
7
8---
8---
9
9
10−<!-- Using a normal ticket is still fine, but feel free to ask your
10+
11−questions about bat on https://github.com/sharkdp/bat/discussions instead. -->
.github/dependabot.ymldeleted−18
@@ -1,18 +0,0 @@
1−version: 2
2−updates:
3−- package-ecosystem: cargo
4− directory: "/"
5− schedule:
6− interval: monthly
7− time: "04:00"
8− timezone: Europe/Berlin
9− ignore:
10− - dependency-name: git2
11− versions:
12− - 0.13.17
13−- package-ecosystem: gitsubmodule
14− directory: "/"
15− schedule:
16− interval: monthly
17− time: "04:00"
18− timezone: Europe/Berlin
.github/workflows/CICD.yml+298−324
@@ -1,69 +1,35 @@
1name: CICD
1name: CICD
2
2
3env:
3env:
4+ PROJECT_NAME: bat
5+ PROJECT_DESC: "A `cat` clone with wings"
6+ PROJECT_MAINTAINER: "David Peter <mail@david-peter.de>"
7+ PROJECT_HOMEPAGE: "https://github.com/sharkdp/bat"
4− MIN_SUPPORTED_RUST_VERSION: "1.51.0"
8+ MIN_SUPPORTED_RUST_VERSION: "1.40.0"
5− CICD_INTERMEDIATES_DIR: "_cicd-intermediates"
6
9
7−on:
10+on: [push, pull_request]
8− workflow_dispatch:
9− pull_request:
10− push:
11− branches:
12− - master
13− tags:
14− - '*'
15
11
16jobs:
12jobs:
17− ensure_cargo_fmt:
18− name: Ensure 'cargo fmt' has been run
19− runs-on: ubuntu-20.04
20− steps:
21− - uses: actions-rs/toolchain@v1
22− with:
23− toolchain: stable
24− default: true
25− profile: minimal
26− components: rustfmt
27− - uses: actions/checkout@v2
28− - run: cargo fmt -- --check
29−
30− license_checks:
31− name: License checks
32− runs-on: ubuntu-20.04
33− steps:
34− - uses: actions/checkout@v2
35− with:
36− submodules: true # we especially want to perform license checks on submodules
37− - run: tests/scripts/license-checks.sh
38−
39 min_version:
13 min_version:
40 name: Minimum supported rust version
14 name: Minimum supported rust version
41− runs-on: ubuntu-20.04
15+ runs-on: ubuntu-latest
42 steps:
16 steps:
43− - name: Checkout source code
17+ - name: Git checkout
44 uses: actions/checkout@v2
18 uses: actions/checkout@v2
45−
46 - name: Install rust toolchain (v${{ env.MIN_SUPPORTED_RUST_VERSION }})
19 - name: Install rust toolchain (v${{ env.MIN_SUPPORTED_RUST_VERSION }})
47 uses: actions-rs/toolchain@v1
20 uses: actions-rs/toolchain@v1
48 with:
21 with:
49 toolchain: ${{ env.MIN_SUPPORTED_RUST_VERSION }}
22 toolchain: ${{ env.MIN_SUPPORTED_RUST_VERSION }}
50 default: true
23 default: true
51 profile: minimal # minimal component installation (ie, no documentation)
24 profile: minimal # minimal component installation (ie, no documentation)
52− components: clippy
25+ - name: Test
53− - name: Run clippy (on minimum supported rust version to prevent warnings we can't fix)
54− uses: actions-rs/cargo@v1
55− with:
56− command: clippy
57− args: --locked --all-targets --all-features
58− - name: Run tests
59 uses: actions-rs/cargo@v1
26 uses: actions-rs/cargo@v1
60 with:
27 with:
61 command: test
28 command: test
62− args: --locked
63
29
64 test_with_new_syntaxes_and_themes:
30 test_with_new_syntaxes_and_themes:
65− name: Run tests with updated syntaxes and themes
31+ name: Test with new syntaxes and themes
66− runs-on: ubuntu-20.04
32+ runs-on: ubuntu-latest
67 steps:
33 steps:
68 - name: Git checkout
34 - name: Git checkout
69 uses: actions/checkout@v2
35 uses: actions/checkout@v2
@@ -91,100 +57,159 @@ jobs:
91 uses: actions-rs/cargo@v1
57 uses: actions-rs/cargo@v1
92 with:
58 with:
93 command: test
59 command: test
94− args: --locked --release
95− - name: Run ignored-by-default unit tests with new syntaxes and themes
96− uses: actions-rs/cargo@v1
97− with:
98− command: test
99− args: --locked --release -- --ignored
60+ args: --release
100 - name: Syntax highlighting regression test
61 - name: Syntax highlighting regression test
101 run: tests/syntax-tests/regression_test.sh
62 run: tests/syntax-tests/regression_test.sh
102 - name: List of languages
63 - name: List of languages
103 run: bat --list-languages
64 run: bat --list-languages
104 - name: List of themes
65 - name: List of themes
105 run: bat --list-themes
66 run: bat --list-themes
106− - name: Test custom assets
107− run: tests/syntax-tests/test_custom_assets.sh
108−
109− documentation:
110− name: Documentation
111− runs-on: ubuntu-20.04
112− steps:
113− - name: Git checkout
114− uses: actions/checkout@v2
115− - name: Install Rust toolchain
116− uses: actions-rs/toolchain@v1
117− with:
118− toolchain: stable
119− default: true
120− profile: minimal
121− - name: Print -h
122− uses: actions-rs/cargo@v1
123− with:
124− command: run
125− args: --locked -- -h
126− - name: Print --help
127− uses: actions-rs/cargo@v1
128− with:
129− command: run
130− args: --locked -- --help
131− - name: Show man page
132− run: man $(find . -name bat.1)
133− - name: Check documentation
134− env:
135− RUSTDOCFLAGS: -D warnings
136− uses: actions-rs/cargo@v1
137− with:
138− command: doc
139− args: --locked --no-deps --document-private-items --all-features
140
67
141 build:
68 build:
142− name: ${{ matrix.job.target }} (${{ matrix.job.os }})
69+ name: Build
143 runs-on: ${{ matrix.job.os }}
70 runs-on: ${{ matrix.job.os }}
144 strategy:
71 strategy:
145 fail-fast: false
72 fail-fast: false
146 matrix:
73 matrix:
147 job:
74 job:
148− - { target: aarch64-unknown-linux-gnu , os: ubuntu-20.04, use-cross: true }
75+ # { os, target, cargo-options, features, use-cross, toolchain }
149− - { target: arm-unknown-linux-gnueabihf , os: ubuntu-20.04, use-cross: true }
76+ - { os: ubuntu-latest , target: arm-unknown-linux-gnueabihf , use-cross: use-cross }
150− - { target: arm-unknown-linux-musleabihf, os: ubuntu-20.04, use-cross: true }
77+ - { os: ubuntu-18.04 , target: aarch64-unknown-linux-gnu , use-cross: use-cross }
151− - { target: i686-pc-windows-msvc , os: windows-2019 }
152− - { target: i686-unknown-linux-gnu , os: ubuntu-20.04, use-cross: true }
78+ - { os: ubuntu-18.04 , target: i686-unknown-linux-gnu , use-cross: use-cross }
153− - { target: i686-unknown-linux-musl , os: ubuntu-20.04, use-cross: true }
79+ - { os: ubuntu-18.04 , target: i686-unknown-linux-musl , use-cross: use-cross }
80+ - { os: ubuntu-18.04 , target: x86_64-unknown-linux-gnu , use-cross: use-cross }
81+ - { os: ubuntu-18.04 , target: x86_64-unknown-linux-musl , use-cross: use-cross }
82+ - { os: ubuntu-16.04 , target: x86_64-unknown-linux-gnu , use-cross: use-cross }
154− - { target: x86_64-apple-darwin , os: macos-10.15 }
83+ - { os: macos-latest , target: x86_64-apple-darwin }
155− - { target: x86_64-pc-windows-gnu , os: windows-2019 }
84+ # - { os: windows-latest , target: i686-pc-windows-gnu } ## disabled; linker errors (missing '_imp____acrt_iob_func')
156− - { target: x86_64-pc-windows-msvc , os: windows-2019 }
85+ - { os: windows-latest , target: i686-pc-windows-msvc }
157− - { target: x86_64-unknown-linux-gnu , os: ubuntu-20.04, use-cross: true }
86+ # - { os: windows-latest , target: x86_64-pc-windows-gnu } ## disabled; linker errors (missing '_imp____acrt_iob_func')
158− - { target: x86_64-unknown-linux-musl , os: ubuntu-20.04, use-cross: true }
87+ - { os: windows-latest , target: x86_64-pc-windows-msvc }
159 steps:
88 steps:
160− - name: Checkout source code
89+ - name: Git checkout
161 uses: actions/checkout@v2
90 uses: actions/checkout@v2
162−
163 - name: Install prerequisites
91 - name: Install prerequisites
164 shell: bash
92 shell: bash
165 run: |
93 run: |
166 case ${{ matrix.job.target }} in
94 case ${{ matrix.job.target }} in
167− arm-unknown-linux-*) sudo apt-get -y update ; sudo apt-get -y install gcc-arm-linux-gnueabihf ;;
95+ arm-unknown-linux-gnueabihf) sudo apt-get -y update ; sudo apt-get -y install gcc-arm-linux-gnueabihf ;;
168 aarch64-unknown-linux-gnu) sudo apt-get -y update ; sudo apt-get -y install gcc-aarch64-linux-gnu ;;
96 aarch64-unknown-linux-gnu) sudo apt-get -y update ; sudo apt-get -y install gcc-aarch64-linux-gnu ;;
169 esac
97 esac
170−
98+ - name: Initialize workflow variables
171− - name: Extract crate information
99+ id: vars
172 shell: bash
100 shell: bash
173 run: |
101 run: |
174− echo "PROJECT_NAME=$(sed -n 's/^name = "\(.*\)"/\1/p' Cargo.toml | head -n1)" >> $GITHUB_ENV
102+ # toolchain
175− echo "PROJECT_VERSION=$(sed -n 's/^version = "\(.*\)"/\1/p' Cargo.toml | head -n1)" >> $GITHUB_ENV
103+ TOOLCHAIN="stable" ## default to "stable" toolchain
176− echo "PROJECT_MAINTAINER=$(sed -n 's/^authors = \["\(.*\)"\]/\1/p' Cargo.toml)" >> $GITHUB_ENV
104+ # * specify alternate TOOLCHAIN for *-pc-windows-gnu targets; gnu targets on Windows are broken for the standard *-pc-windows-msvc toolchain (refs: <https://github.com/rust-lang/rust/issues/47048>, <https://github.com/rust-lang/rust/issues/53454>, <https://github.com/rust-lang/cargo/issues/6754>)
177− echo "PROJECT_HOMEPAGE=$(sed -n 's/^homepage = "\(.*\)"/\1/p' Cargo.toml)" >> $GITHUB_ENV
105+ case ${{ matrix.job.target }} in *-pc-windows-gnu) TOOLCHAIN="stable-${{ matrix.job.target }}" ;; esac;
178−
106+ # * use requested TOOLCHAIN if specified
107+ if [ -n "${{ matrix.job.toolchain }}" ]; then TOOLCHAIN="${{ matrix.job.toolchain }}" ; fi
108+ echo set-output name=TOOLCHAIN::${TOOLCHAIN}
109+ echo ::set-output name=TOOLCHAIN::${TOOLCHAIN}
110+ # staging directory
111+ STAGING='_staging'
112+ echo set-output name=STAGING::${STAGING}
113+ echo ::set-output name=STAGING::${STAGING}
114+ # determine EXE suffix
115+ EXE_suffix="" ; case ${{ matrix.job.target }} in *-pc-windows-*) EXE_suffix=".exe" ;; esac;
116+ echo set-output name=EXE_suffix::${EXE_suffix}
117+ echo ::set-output name=EXE_suffix::${EXE_suffix}
118+ # parse commit reference info
119+ REF_NAME=${GITHUB_REF#refs/*/}
120+ unset REF_BRANCH ; case ${GITHUB_REF} in refs/heads/*) REF_BRANCH=${GITHUB_REF#refs/heads/} ;; esac;
121+ unset REF_TAG ; case ${GITHUB_REF} in refs/tags/*) REF_TAG=${GITHUB_REF#refs/tags/} ;; esac;
122+ REF_SHAS=${GITHUB_SHA:0:8}
123+ echo set-output name=REF_NAME::${REF_NAME}
124+ echo set-output name=REF_BRANCH::${REF_BRANCH}
125+ echo set-output name=REF_TAG::${REF_TAG}
126+ echo set-output name=REF_SHAS::${REF_SHAS}
127+ echo ::set-output name=REF_NAME::${REF_NAME}
128+ echo ::set-output name=REF_BRANCH::${REF_BRANCH}
129+ echo ::set-output name=REF_TAG::${REF_TAG}
130+ echo ::set-output name=REF_SHAS::${REF_SHAS}
131+ # parse target
132+ unset TARGET_ARCH ; case ${{ matrix.job.target }} in arm-unknown-linux-gnueabihf) TARGET_ARCH=arm ;; i686-*) TARGET_ARCH=i686 ;; x86_64-*) TARGET_ARCH=x86_64 ;; esac;
133+ echo set-output name=TARGET_ARCH::${TARGET_ARCH}
134+ echo ::set-output name=TARGET_ARCH::${TARGET_ARCH}
135+ unset TARGET_OS ; case ${{ matrix.job.target }} in *-linux-*) TARGET_OS=linux ;; *-apple-*) TARGET_OS=macos ;; *-windows-*) TARGET_OS=windows ;; esac;
136+ echo set-output name=TARGET_OS::${TARGET_OS}
137+ echo ::set-output name=TARGET_OS::${TARGET_OS}
138+ # package name
139+ PKG_suffix=".tar.gz" ; case ${{ matrix.job.target }} in *-pc-windows-*) PKG_suffix=".zip" ;; esac;
140+ PKG_BASENAME=${PROJECT_NAME}-${REF_TAG:-$REF_SHAS}-${{ matrix.job.target }}
141+ PKG_NAME=${PKG_BASENAME}${PKG_suffix}
142+ echo set-output name=PKG_suffix::${PKG_suffix}
143+ echo set-output name=PKG_BASENAME::${PKG_BASENAME}
144+ echo set-output name=PKG_NAME::${PKG_NAME}
145+ echo ::set-output name=PKG_suffix::${PKG_suffix}
146+ echo ::set-output name=PKG_BASENAME::${PKG_BASENAME}
147+ echo ::set-output name=PKG_NAME::${PKG_NAME}
148+ # deployable tag? (ie, leading "vM" or "M"; M == version number)
149+ unset DEPLOY ; if [[ $REF_TAG =~ ^[vV]?[0-9].* ]]; then DEPLOY='true' ; fi
150+ echo set-output name=DEPLOY::${DEPLOY:-<empty>/false}
151+ echo ::set-output name=DEPLOY::${DEPLOY}
152+ # DPKG architecture?
153+ unset DPKG_ARCH
154+ case ${{ matrix.job.target }} in
155+ aarch64-*-linux-*) DPKG_ARCH=arm64 ;;
156+ arm-*-linux-*hf) DPKG_ARCH=armhf ;;
157+ i686-*-linux-*) DPKG_ARCH=i686 ;;
158+ x86_64-*-linux-*) DPKG_ARCH=amd64 ;;
159+ esac;
160+ echo set-output name=DPKG_ARCH::${DPKG_ARCH}
161+ echo ::set-output name=DPKG_ARCH::${DPKG_ARCH}
162+ # DPKG version?
163+ unset DPKG_VERSION ; if [[ $REF_TAG =~ ^[vV]?[0-9].* ]]; then DPKG_VERSION=${REF_TAG/#[vV]/} ; fi
164+ echo set-output name=DPKG_VERSION::${DPKG_VERSION}
165+ echo ::set-output name=DPKG_VERSION::${DPKG_VERSION}
166+ # DPKG base name/conflicts?
167+ DPKG_BASENAME=${PROJECT_NAME}
168+ DPKG_CONFLICTS=${PROJECT_NAME}-musl
169+ case ${{ matrix.job.target }} in *-musl) DPKG_BASENAME=${PROJECT_NAME}-musl ; DPKG_CONFLICTS=${PROJECT_NAME} ;; esac;
170+ echo set-output name=DPKG_BASENAME::${DPKG_BASENAME}
171+ echo set-output name=DPKG_CONFLICTS::${DPKG_CONFLICTS}
172+ echo ::set-output name=DPKG_BASENAME::${DPKG_BASENAME}
173+ echo ::set-output name=DPKG_CONFLICTS::${DPKG_CONFLICTS}
174+ # DPKG name
175+ unset DPKG_NAME;
176+ if [[ -n $DPKG_ARCH && -n $DPKG_VERSION ]]; then DPKG_NAME="${DPKG_BASENAME}_${DPKG_VERSION}_${DPKG_ARCH}.deb" ; fi
177+ echo set-output name=DPKG_NAME::${DPKG_NAME}
178+ echo ::set-output name=DPKG_NAME::${DPKG_NAME}
179+ # target-specific options
180+ # * CARGO_USE_CROSS (truthy)
181+ CARGO_USE_CROSS='true' ; case '${{ matrix.job.use-cross }}' in ''|0|f|false|n|no) unset CARGO_USE_CROSS ;; esac;
182+ echo set-output name=CARGO_USE_CROSS::${CARGO_USE_CROSS:-<empty>/false}
183+ echo ::set-output name=CARGO_USE_CROSS::${CARGO_USE_CROSS}
184+ # # * `arm` cannot be tested on ubuntu-* hosts (b/c testing is currently primarily done via comparison of target outputs with built-in outputs and the `arm` target is not executable on the host)
185+ JOB_DO_TESTING="true"
186+ case ${{ matrix.job.target }} in arm-*) unset JOB_DO_TESTING ;; esac;
187+ echo set-output name=JOB_DO_TESTING::${JOB_DO_TESTING:-<empty>/false}
188+ echo ::set-output name=JOB_DO_TESTING::${JOB_DO_TESTING}
189+ # # * test only library unit tests and binary for arm-type targets
190+ unset CARGO_TEST_OPTIONS
191+ unset CARGO_TEST_OPTIONS ; case ${{ matrix.job.target }} in arm-* | aarch64-*) CARGO_TEST_OPTIONS="--lib --bin ${PROJECT_NAME}" ;; esac;
192+ echo set-output name=CARGO_TEST_OPTIONS::${CARGO_TEST_OPTIONS}
193+ echo ::set-output name=CARGO_TEST_OPTIONS::${CARGO_TEST_OPTIONS}
194+ # * executable for `strip`?
195+ STRIP="strip" ; case ${{ matrix.job.target }} in arm-unknown-linux-gnueabihf) STRIP="arm-linux-gnueabihf-strip" ;; aarch64-unknown-linux-gnu) STRIP="aarch64-linux-gnu-strip" ;; *-pc-windows-msvc) STRIP="" ;; esac;
196+ echo set-output name=STRIP::${STRIP}
197+ echo ::set-output name=STRIP::${STRIP}
198+ - name: Create all needed build/work directories
199+ shell: bash
200+ run: |
201+ mkdir -p '${{ steps.vars.outputs.STAGING }}'
202+ mkdir -p '${{ steps.vars.outputs.STAGING }}/${{ steps.vars.outputs.PKG_BASENAME }}'
203+ mkdir -p '${{ steps.vars.outputs.STAGING }}/${{ steps.vars.outputs.PKG_BASENAME }}/autocomplete'
204+ mkdir -p '${{ steps.vars.outputs.STAGING }}/dpkg'
179 - name: Install Rust toolchain
205 - name: Install Rust toolchain
180 uses: actions-rs/toolchain@v1
206 uses: actions-rs/toolchain@v1
181 with:
207 with:
182− toolchain: stable
208+ toolchain: ${{ steps.vars.outputs.TOOLCHAIN }}
183 target: ${{ matrix.job.target }}
209 target: ${{ matrix.job.target }}
184 override: true
210 override: true
185 profile: minimal # minimal component installation (ie, no documentation)
211 profile: minimal # minimal component installation (ie, no documentation)
186−
212+ - name: Info
187− - name: Show version information (Rust, cargo, GCC)
188 shell: bash
213 shell: bash
189 run: |
214 run: |
190 gcc --version || true
215 gcc --version || true
@@ -193,131 +218,63 @@ jobs:
193 rustup default
218 rustup default
194 cargo -V
219 cargo -V
195 rustc -V
220 rustc -V
196−
197 - name: Build
221 - name: Build
198 uses: actions-rs/cargo@v1
222 uses: actions-rs/cargo@v1
199 with:
223 with:
200− use-cross: ${{ matrix.job.use-cross }}
224+ use-cross: ${{ steps.vars.outputs.CARGO_USE_CROSS }}
201 command: build
225 command: build
202− args: --locked --release --target=${{ matrix.job.target }}
226+ args: --release --target=${{ matrix.job.target }} ${{ matrix.job.cargo-options }}
203−
204− - name: Strip debug information from executable
205− id: strip
206− shell: bash
207− run: |
208− # Figure out suffix of binary
209− EXE_suffix=""
210− case ${{ matrix.job.target }} in
211− *-pc-windows-*) EXE_suffix=".exe" ;;
212− esac;
213−
214− # Figure out what strip tool to use if any
215− STRIP="strip"
216− case ${{ matrix.job.target }} in
217− arm-unknown-linux-*) STRIP="arm-linux-gnueabihf-strip" ;;
218− aarch64-unknown-linux-gnu) STRIP="aarch64-linux-gnu-strip" ;;
219− *-pc-windows-msvc) STRIP="" ;;
220− esac;
221−
222− # Setup paths
223− BIN_DIR="${{ env.CICD_INTERMEDIATES_DIR }}/stripped-release-bin/"
224− mkdir -p "${BIN_DIR}"
225− BIN_NAME="${{ env.PROJECT_NAME }}${EXE_suffix}"
226− BIN_PATH="${BIN_DIR}/${BIN_NAME}"
227−
228− # Copy the release build binary to the result location
229− cp "target/${{ matrix.job.target }}/release/${BIN_NAME}" "${BIN_DIR}"
230−
231− # Also strip if possible
232− if [ -n "${STRIP}" ]; then
233− "${STRIP}" "${BIN_PATH}"
234− fi
235−
236− # Let subsequent steps know where to find the (stripped) bin
237− echo ::set-output name=BIN_PATH::${BIN_PATH}
238− echo ::set-output name=BIN_NAME::${BIN_NAME}
239−
240− - name: Set testing options
241− id: test-options
242− shell: bash
243− run: |
244− # test only library unit tests and binary for arm-type targets
245− unset CARGO_TEST_OPTIONS
246− unset CARGO_TEST_OPTIONS ; case ${{ matrix.job.target }} in arm-* | aarch64-*) CARGO_TEST_OPTIONS="--lib --bin ${PROJECT_NAME}" ;; esac;
247− echo ::set-output name=CARGO_TEST_OPTIONS::${CARGO_TEST_OPTIONS}
248−
249− - name: Run tests
227+ - name: Test
250 uses: actions-rs/cargo@v1
228 uses: actions-rs/cargo@v1
251 with:
229 with:
252− use-cross: ${{ matrix.job.use-cross }}
230+ use-cross: ${{ steps.vars.outputs.CARGO_USE_CROSS }}
253 command: test
231 command: test
254− args: --locked --target=${{ matrix.job.target }} ${{ steps.test-options.outputs.CARGO_TEST_OPTIONS}}
232+ args: --target=${{ matrix.job.target }} ${{ steps.vars.outputs.CARGO_TEST_OPTIONS}} ${{ matrix.job.cargo-options }}
255−
233+ - name: bat test run
256− - name: Run bat
257− uses: actions-rs/cargo@v1
258− with:
259− use-cross: ${{ matrix.job.use-cross }}
260− command: run
261− args: --locked --target=${{ matrix.job.target }} -- --paging=never --color=always --theme=ansi Cargo.toml src/config.rs
262−
263− - name: Show diagnostics (bat --diagnostic)
264 uses: actions-rs/cargo@v1
234 uses: actions-rs/cargo@v1
265 with:
235 with:
266− use-cross: ${{ matrix.job.use-cross }}
236+ use-cross: ${{ steps.vars.outputs.CARGO_USE_CROSS }}
267 command: run
237 command: run
268− args: --locked --target=${{ matrix.job.target }} -- --paging=never --color=always --theme=ansi Cargo.toml src/config.rs --diagnostic
238+ args: --target=${{ matrix.job.target }} ${{ matrix.job.cargo-options }} -- --paging=never --color=always --theme=ansi-dark Cargo.toml src/config.rs
269−
270− - name: "Feature check: regex-onig"
239+ - name: Check features regex-onig
271 uses: actions-rs/cargo@v1
240 uses: actions-rs/cargo@v1
272 with:
241 with:
273− use-cross: ${{ matrix.job.use-cross }}
242+ use-cross: ${{ steps.vars.outputs.CARGO_USE_CROSS }}
274 command: check
243 command: check
275− args: --locked --target=${{ matrix.job.target }} --verbose --lib --no-default-features --features regex-onig
244+ args: --target=${{ matrix.job.target }} --verbose --lib --no-default-features --features regex-onig
276−
277− - name: "Feature check: regex-onig,git"
245+ - name: Check features regex-onig,git
278 uses: actions-rs/cargo@v1
246 uses: actions-rs/cargo@v1
279 with:
247 with:
280− use-cross: ${{ matrix.job.use-cross }}
248+ use-cross: ${{ steps.vars.outputs.CARGO_USE_CROSS }}
281 command: check
249 command: check
282− args: --locked --target=${{ matrix.job.target }} --verbose --lib --no-default-features --features regex-onig,git
250+ args: --target=${{ matrix.job.target }} --verbose --lib --no-default-features --features regex-onig,git
283−
284− - name: "Feature check: regex-onig,paging"
251+ - name: Check features regex-onig,paging
285 uses: actions-rs/cargo@v1
252 uses: actions-rs/cargo@v1
286 with:
253 with:
287− use-cross: ${{ matrix.job.use-cross }}
254+ use-cross: ${{ steps.vars.outputs.CARGO_USE_CROSS }}
288 command: check
255 command: check
289− args: --locked --target=${{ matrix.job.target }} --verbose --lib --no-default-features --features regex-onig,paging
256+ args: --target=${{ matrix.job.target }} --verbose --lib --no-default-features --features regex-onig,paging
290−
291− - name: "Feature check: regex-onig,git,paging"
257+ - name: Check features regex-onig,git,paging
292 uses: actions-rs/cargo@v1
258 uses: actions-rs/cargo@v1
293 with:
259 with:
294− use-cross: ${{ matrix.job.use-cross }}
260+ use-cross: ${{ steps.vars.outputs.CARGO_USE_CROSS }}
295 command: check
261 command: check
296− args: --locked --target=${{ matrix.job.target }} --verbose --lib --no-default-features --features regex-onig,git,paging
262+ args: --target=${{ matrix.job.target }} --verbose --lib --no-default-features --features regex-onig,git,paging
297−
263+ - name: Upload build artifacts
298− - name: "Feature check: minimal-application"
299− uses: actions-rs/cargo@v1
264+ uses: actions/upload-artifact@master
300 with:
265 with:
301− use-cross: ${{ matrix.job.use-cross }}
266+ name: ${{ env.PROJECT_NAME }}-${{ matrix.job.target }}
302− command: check
267+ path: target/${{ matrix.job.target }}/release/${{ env.PROJECT_NAME }}${{ steps.vars.outputs.EXE_suffix }}
303− args: --locked --target=${{ matrix.job.target }} --verbose --no-default-features --features minimal-application
268+ - name: Package
304−
305− - name: Create tarball
306− id: package
307 shell: bash
269 shell: bash
308 run: |
270 run: |
309− PKG_suffix=".tar.gz" ; case ${{ matrix.job.target }} in *-pc-windows-*) PKG_suffix=".zip" ;; esac;
271+ ARCHIVE_DIR='${{ steps.vars.outputs.STAGING }}/${{ steps.vars.outputs.PKG_BASENAME }}/'
310− PKG_BASENAME=${PROJECT_NAME}-v${PROJECT_VERSION}-${{ matrix.job.target }}
272+ COPYRIGHT_YEARS="2018 - "$(date "+%Y")
311− PKG_NAME=${PKG_BASENAME}${PKG_suffix}
312− echo ::set-output name=PKG_NAME::${PKG_NAME}
313−
314− PKG_STAGING="${{ env.CICD_INTERMEDIATES_DIR }}/package"
315− ARCHIVE_DIR="${PKG_STAGING}/${PKG_BASENAME}/"
316− mkdir -p "${ARCHIVE_DIR}"
317− mkdir -p "${ARCHIVE_DIR}/autocomplete"
318−
319 # Binary
273 # Binary
320− cp "${{ steps.strip.outputs.BIN_PATH }}" "$ARCHIVE_DIR"
274+ cp 'target/${{ matrix.job.target }}/release/${{ env.PROJECT_NAME }}${{ steps.vars.outputs.EXE_suffix }}' "$ARCHIVE_DIR"
275+
276+ # `strip` binary (if needed)
277+ if [ -n "${{ steps.vars.outputs.STRIP }}" ]; then "${{ steps.vars.outputs.STRIP }}" "$ARCHIVE_DIR/${{ env.PROJECT_NAME }}${{ steps.vars.outputs.EXE_suffix }}" ; fi
321
278
322 # Man page
279 # Man page
323 cp 'target/${{ matrix.job.target }}/release/build/${{ env.PROJECT_NAME }}'-*/out/assets/manual/bat.1 "$ARCHIVE_DIR"
280 cp 'target/${{ matrix.job.target }}/release/build/${{ env.PROJECT_NAME }}'-*/out/assets/manual/bat.1 "$ARCHIVE_DIR"
@@ -326,69 +283,53 @@ jobs:
326 cp "README.md" "LICENSE-MIT" "LICENSE-APACHE" "CHANGELOG.md" "$ARCHIVE_DIR"
283 cp "README.md" "LICENSE-MIT" "LICENSE-APACHE" "CHANGELOG.md" "$ARCHIVE_DIR"
327
284
328 # Autocompletion files
285 # Autocompletion files
329− cp 'target/${{ matrix.job.target }}/release/build/${{ env.PROJECT_NAME }}'-*/out/assets/completions/bat.bash "$ARCHIVE_DIR/autocomplete/${{ env.PROJECT_NAME }}.bash"
330 cp 'target/${{ matrix.job.target }}/release/build/${{ env.PROJECT_NAME }}'-*/out/assets/completions/bat.fish "$ARCHIVE_DIR/autocomplete/${{ env.PROJECT_NAME }}.fish"
286 cp 'target/${{ matrix.job.target }}/release/build/${{ env.PROJECT_NAME }}'-*/out/assets/completions/bat.fish "$ARCHIVE_DIR/autocomplete/${{ env.PROJECT_NAME }}.fish"
331− cp 'target/${{ matrix.job.target }}/release/build/${{ env.PROJECT_NAME }}'-*/out/assets/completions/_bat.ps1 "$ARCHIVE_DIR/autocomplete/_${{ env.PROJECT_NAME }}.ps1"
332 cp 'target/${{ matrix.job.target }}/release/build/${{ env.PROJECT_NAME }}'-*/out/assets/completions/bat.zsh "$ARCHIVE_DIR/autocomplete/${{ env.PROJECT_NAME }}.zsh"
287 cp 'target/${{ matrix.job.target }}/release/build/${{ env.PROJECT_NAME }}'-*/out/assets/completions/bat.zsh "$ARCHIVE_DIR/autocomplete/${{ env.PROJECT_NAME }}.zsh"
333
288
334 # base compressed package
289 # base compressed package
335− pushd "${PKG_STAGING}/" >/dev/null
290+ pushd '${{ steps.vars.outputs.STAGING }}/' >/dev/null
336 case ${{ matrix.job.target }} in
291 case ${{ matrix.job.target }} in
337− *-pc-windows-*) 7z -y a "${PKG_NAME}" "${PKG_BASENAME}"/* | tail -2 ;;
292+ *-pc-windows-*) 7z -y a '${{ steps.vars.outputs.PKG_NAME }}' '${{ steps.vars.outputs.PKG_BASENAME }}'/* | tail -2 ;;
338− *) tar czf "${PKG_NAME}" "${PKG_BASENAME}"/* ;;
293+ *) tar czf '${{ steps.vars.outputs.PKG_NAME }}' '${{ steps.vars.outputs.PKG_BASENAME }}'/* ;;
339 esac;
294 esac;
340 popd >/dev/null
295 popd >/dev/null
341
296
342− # Let subsequent steps know where to find the compressed package
343− echo ::set-output name=PKG_PATH::"${PKG_STAGING}/${PKG_NAME}"
344−
345− - name: Create Debian package
297+ # Debian package
346− id: debian-package
298+ if [ -n "${{ steps.vars.outputs.DPKG_NAME }}" ]; then
347− shell: bash
299+ DPKG_DIR="${{ steps.vars.outputs.STAGING }}/dpkg"
348− if: startsWith(matrix.job.os, 'ubuntu')
300+
349− run: |
301+ # Binary
350− COPYRIGHT_YEARS="2018 - "$(date "+%Y")
302+ install -Dm755 'target/${{ matrix.job.target }}/release/${{ env.PROJECT_NAME }}${{ steps.vars.outputs.EXE_suffix }}' "${DPKG_DIR}/usr/bin/${{ env.PROJECT_NAME }}${{ steps.vars.outputs.EXE_suffix }}"
351− DPKG_STAGING="${{ env.CICD_INTERMEDIATES_DIR }}/debian-package"
303+ if [ -n "${{ steps.vars.outputs.STRIP }}" ]; then "${{ steps.vars.outputs.STRIP }}" "${DPKG_DIR}/usr/bin/${{ env.PROJECT_NAME }}${{ steps.vars.outputs.EXE_suffix }}" ; fi
352− DPKG_DIR="${DPKG_STAGING}/dpkg"
304+
305+ # Work out shared library dependencies
306+ # dpkg-shlibdeps requires debian/control file. Dummy it and clean up
353− mkdir -p "${DPKG_DIR}"
307+ mkdir "./debian"
354−
308+ touch "./debian/control"
355− DPKG_BASENAME=${PROJECT_NAME}
356− DPKG_CONFLICTS=${PROJECT_NAME}-musl
357− case ${{ matrix.job.target }} in *-musl) DPKG_BASENAME=${PROJECT_NAME}-musl ; DPKG_CONFLICTS=${PROJECT_NAME} ;; esac;
309+ case ${{ matrix.job.target }} in
358− DPKG_VERSION=${PROJECT_VERSION}
310+ aarch64-*-linux-*) DEPENDS="$(dpkg-shlibdeps -l/usr/aarch64-linux-gnu/lib -O "${DPKG_DIR}/usr/bin/${{ env.PROJECT_NAME }}" 2> /dev/null | sed 's/^shlibs:Depends=//')" ;;
359−
311+ arm-*-linux-*hf) DEPENDS="$(dpkg-shlibdeps -l/usr/arm-linux-gnueabihf/lib -O "${DPKG_DIR}/usr/bin/${{ env.PROJECT_NAME }}" 2> /dev/null | sed 's/^shlibs:Depends=//')" ;;
360− unset DPKG_ARCH
312+ i686-*-linux-*) DEPENDS="$(dpkg-shlibdeps -O "${DPKG_DIR}/usr/bin/${{ env.PROJECT_NAME }}" 2> /dev/null | sed 's/^shlibs:Depends=//')" ;;
361− case ${{ matrix.job.target }} in
313+ x86_64-*-linux-*) DEPENDS="$(dpkg-shlibdeps -O "${DPKG_DIR}/usr/bin/${{ env.PROJECT_NAME }}" 2> /dev/null | sed 's/^shlibs:Depends=//')" ;;
362− aarch64-*-linux-*) DPKG_ARCH=arm64 ;;
314+ esac;
363− arm-*-linux-*hf) DPKG_ARCH=armhf ;;
315+ rm -rf "./debian"
364− i686-*-linux-*) DPKG_ARCH=i686 ;;
316+
365− x86_64-*-linux-*) DPKG_ARCH=amd64 ;;
366− *) DPKG_ARCH=notset ;;
367− esac;
368−
369− DPKG_NAME="${DPKG_BASENAME}_${DPKG_VERSION}_${DPKG_ARCH}.deb"
370− echo ::set-output name=DPKG_NAME::${DPKG_NAME}
371−
372− # Binary
373− install -Dm755 "${{ steps.strip.outputs.BIN_PATH }}" "${DPKG_DIR}/usr/bin/${{ steps.strip.outputs.BIN_NAME }}"
374−
375− # Man page
317+ # Man page
376− install -Dm644 'target/${{ matrix.job.target }}/release/build/${{ env.PROJECT_NAME }}'-*/out/assets/manual/bat.1 "${DPKG_DIR}/usr/share/man/man1/${{ env.PROJECT_NAME }}.1"
318+ install -Dm644 'target/${{ matrix.job.target }}/release/build/${{ env.PROJECT_NAME }}'-*/out/assets/manual/bat.1 "${DPKG_DIR}/usr/share/man/man1/${{ env.PROJECT_NAME }}.1"
377− gzip -n --best "${DPKG_DIR}/usr/share/man/man1/${{ env.PROJECT_NAME }}.1"
319+ gzip -n --best "${DPKG_DIR}/usr/share/man/man1/${{ env.PROJECT_NAME }}.1"
378−
320+
379− # Autocompletion files
321+ # Autocompletion files
380− install -Dm644 'target/${{ matrix.job.target }}/release/build/${{ env.PROJECT_NAME }}'-*/out/assets/completions/bat.bash "${DPKG_DIR}/usr/share/bash-completion/completions/${{ env.PROJECT_NAME }}"
381− install -Dm644 'target/${{ matrix.job.target }}/release/build/${{ env.PROJECT_NAME }}'-*/out/assets/completions/bat.fish "${DPKG_DIR}/usr/share/fish/vendor_completions.d/${{ env.PROJECT_NAME }}.fish"
322+ install -Dm644 'target/${{ matrix.job.target }}/release/build/${{ env.PROJECT_NAME }}'-*/out/assets/completions/bat.fish "${DPKG_DIR}/usr/share/fish/vendor_completions.d/${{ env.PROJECT_NAME }}.fish"
382− install -Dm644 'target/${{ matrix.job.target }}/release/build/${{ env.PROJECT_NAME }}'-*/out/assets/completions/bat.zsh "${DPKG_DIR}/usr/share/zsh/vendor-completions/_${{ env.PROJECT_NAME }}"
323+ install -Dm644 'target/${{ matrix.job.target }}/release/build/${{ env.PROJECT_NAME }}'-*/out/assets/completions/bat.zsh "${DPKG_DIR}/usr/share/zsh/vendor-completions/_${{ env.PROJECT_NAME }}"
383−
324+
384− # README and LICENSE
325+ # README and LICENSE
385− install -Dm644 "README.md" "${DPKG_DIR}/usr/share/doc/${DPKG_BASENAME}/README.md"
326+ install -Dm644 "README.md" "${DPKG_DIR}/usr/share/doc/${{ steps.vars.outputs.DPKG_BASENAME }}/README.md"
386− install -Dm644 "LICENSE-MIT" "${DPKG_DIR}/usr/share/doc/${DPKG_BASENAME}/LICENSE-MIT"
327+ install -Dm644 "LICENSE-MIT" "${DPKG_DIR}/usr/share/doc/${{ steps.vars.outputs.DPKG_BASENAME }}/LICENSE-MIT"
387− install -Dm644 "LICENSE-APACHE" "${DPKG_DIR}/usr/share/doc/${DPKG_BASENAME}/LICENSE-APACHE"
328+ install -Dm644 "LICENSE-APACHE" "${DPKG_DIR}/usr/share/doc/${{ steps.vars.outputs.DPKG_BASENAME }}/LICENSE-APACHE"
388− install -Dm644 "CHANGELOG.md" "${DPKG_DIR}/usr/share/doc/${DPKG_BASENAME}/changelog"
329+ install -Dm644 "CHANGELOG.md" "${DPKG_DIR}/usr/share/doc/${{ steps.vars.outputs.DPKG_BASENAME }}/changelog"
389− gzip -n --best "${DPKG_DIR}/usr/share/doc/${DPKG_BASENAME}/changelog"
330+ gzip -n --best "${DPKG_DIR}/usr/share/doc/${{ steps.vars.outputs.DPKG_BASENAME }}/changelog"
390−
331+
391− cat > "${DPKG_DIR}/usr/share/doc/${DPKG_BASENAME}/copyright" <<EOF
332+ cat > "${DPKG_DIR}/usr/share/doc/${{ steps.vars.outputs.DPKG_BASENAME }}/copyright" <<EOF
392 Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
333 Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
393 Upstream-Name: ${{ env.PROJECT_NAME }}
334 Upstream-Name: ${{ env.PROJECT_NAME }}
394 Source: ${{ env.PROJECT_HOMEPAGE }}
335 Source: ${{ env.PROJECT_HOMEPAGE }}
@@ -399,84 +340,117 @@ jobs:
399 License: Apache-2.0 or MIT
340 License: Apache-2.0 or MIT
400
341
401 License: Apache-2.0
342 License: Apache-2.0
402− On Debian systems, the complete text of the Apache-2.0 can be found in the
343+ On Debian systems, the complete text of the Apache-2.0 can be found in the
403− file /usr/share/common-licenses/Apache-2.0.
344+ file /usr/share/common-licenses/Apache-2.0.
404
345
405 License: MIT
346 License: MIT
406− Permission is hereby granted, free of charge, to any
347+ Permission is hereby granted, free of charge, to any
407− person obtaining a copy of this software and associated
348+ person obtaining a copy of this software and associated
408− documentation files (the "Software"), to deal in the
349+ documentation files (the "Software"), to deal in the
409− Software without restriction, including without
350+ Software without restriction, including without
410− limitation the rights to use, copy, modify, merge,
351+ limitation the rights to use, copy, modify, merge,
411− publish, distribute, sublicense, and/or sell copies of
352+ publish, distribute, sublicense, and/or sell copies of
412− the Software, and to permit persons to whom the Software
353+ the Software, and to permit persons to whom the Software
413− is furnished to do so, subject to the following
354+ is furnished to do so, subject to the following
414− conditions:
355+ conditions:
415− .
356+ .
416− The above copyright notice and this permission notice
357+ The above copyright notice and this permission notice
417− shall be included in all copies or substantial portions
358+ shall be included in all copies or substantial portions
418− of the Software.
359+ of the Software.
419− .
360+ .
420− THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
361+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
421− ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
362+ ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
422− TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
363+ TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
423− PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
364+ PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
424− SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
365+ SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
425− CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
366+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
426− OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
367+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
427− IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
368+ IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
428− DEALINGS IN THE SOFTWARE.
369+ DEALINGS IN THE SOFTWARE.
429 EOF
370 EOF
430− chmod 644 "${DPKG_DIR}/usr/share/doc/${DPKG_BASENAME}/copyright"
371+ chmod 644 "${DPKG_DIR}/usr/share/doc/${{ steps.vars.outputs.DPKG_BASENAME }}/copyright"
431
372
432 # control file
373 # control file
433 mkdir -p "${DPKG_DIR}/DEBIAN"
374 mkdir -p "${DPKG_DIR}/DEBIAN"
434 cat > "${DPKG_DIR}/DEBIAN/control" <<EOF
375 cat > "${DPKG_DIR}/DEBIAN/control" <<EOF
435− Package: ${DPKG_BASENAME}
376+ Package: ${{ steps.vars.outputs.DPKG_BASENAME }}
436− Version: ${DPKG_VERSION}
377+ Version: ${{ steps.vars.outputs.DPKG_VERSION }}
437 Section: utils
378 Section: utils
438 Priority: optional
379 Priority: optional
439 Maintainer: ${{ env.PROJECT_MAINTAINER }}
380 Maintainer: ${{ env.PROJECT_MAINTAINER }}
440 Homepage: ${{ env.PROJECT_HOMEPAGE }}
381 Homepage: ${{ env.PROJECT_HOMEPAGE }}
441− Architecture: ${DPKG_ARCH}
382+ Architecture: ${{ steps.vars.outputs.DPKG_ARCH }}
383+ Depends: $DEPENDS
442 Provides: ${{ env.PROJECT_NAME }}
384 Provides: ${{ env.PROJECT_NAME }}
443− Conflicts: ${DPKG_CONFLICTS}
385+ Conflicts: ${{ steps.vars.outputs.DPKG_CONFLICTS }}
444 Description: cat(1) clone with wings.
386 Description: cat(1) clone with wings.
445− A cat(1) clone with syntax highlighting and Git integration.
387+ A cat(1) clone with syntax highlighting and Git integration.
446 EOF
388 EOF
447
389
448− DPKG_PATH="${DPKG_STAGING}/${DPKG_NAME}"
449− echo ::set-output name=DPKG_PATH::${DPKG_PATH}
450−
451− # build dpkg
390+ # build dpkg
452− fakeroot dpkg-deb --build "${DPKG_DIR}" "${DPKG_PATH}"
391+ fakeroot dpkg-deb --build "${DPKG_DIR}" "${{ steps.vars.outputs.STAGING }}/${{ steps.vars.outputs.DPKG_NAME }}"
453−
392+ fi
454− - name: "Artifact upload: tarball"
455− uses: actions/upload-artifact@master
456− with:
457− name: ${{ steps.package.outputs.PKG_NAME }}
458− path: ${{ steps.package.outputs.PKG_PATH }}
459−
460− - name: "Artifact upload: Debian package"
461− uses: actions/upload-artifact@master
462− if: steps.debian-package.outputs.DPKG_NAME
463− with:
464− name: ${{ steps.debian-package.outputs.DPKG_NAME }}
465− path: ${{ steps.debian-package.outputs.DPKG_PATH }}
466−
467− - name: Check for release
468− id: is-release
469− shell: bash
470− run: |
471− unset IS_RELEASE ; if [[ $GITHUB_REF =~ ^refs/tags/v[0-9].* ]]; then IS_RELEASE='true' ; fi
472− echo ::set-output name=IS_RELEASE::${IS_RELEASE}
473−
474 - name: Publish archives and packages
393 - name: Publish archives and packages
475 uses: softprops/action-gh-release@v1
394 uses: softprops/action-gh-release@v1
476− if: steps.is-release.outputs.IS_RELEASE
395+ if: steps.vars.outputs.DEPLOY
477 with:
396 with:
478 files: |
397 files: |
479− ${{ steps.package.outputs.PKG_PATH }}
398+ ${{ steps.vars.outputs.STAGING }}/${{ steps.vars.outputs.PKG_NAME }}
480− ${{ steps.debian-package.outputs.DPKG_PATH }}
399+ ${{ steps.vars.outputs.STAGING }}/${{ steps.vars.outputs.DPKG_NAME }}
481 env:
400 env:
482 GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
401 GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
402+
403+ coverage:
404+ name: Code Coverage
405+ runs-on: ${{ matrix.job.os }}
406+ strategy:
407+ fail-fast: true
408+ matrix:
409+ # job: [ { os: ubuntu-latest }, { os: macos-latest }, { os: windows-latest } ]
410+ job:
411+ - { os: ubuntu-latest , toolchain: nightly-2020-04-29 }
412+ - { os: macos-latest , toolchain: nightly-2020-04-29 }
413+ - { os: windows-latest , toolchain: nightly-2020-04-29-x86_64-pc-windows-gnu }
414+ steps:
415+ - uses: actions/checkout@v2
416+ - name: Initialize workflow variables
417+ id: vars
418+ shell: bash
419+ run: |
420+ # toolchain
421+ TOOLCHAIN="nightly" ## default to "nightly" toolchain
422+ # * use requested TOOLCHAIN if specified
423+ if [ -n "${{ matrix.job.toolchain }}" ]; then TOOLCHAIN="${{ matrix.job.toolchain }}" ; fi
424+ # * use requested TOOLCHAIN if specified
425+ if [ -n "${{ matrix.job.toolchain }}" ]; then TOOLCHAIN="${{ matrix.job.toolchain }}" ; fi
426+ echo set-output name=TOOLCHAIN::${TOOLCHAIN}
427+ echo ::set-output name=TOOLCHAIN::${TOOLCHAIN}
428+ # target-specific options
429+ # * CODECOV_FLAGS
430+ CODECOV_FLAGS=$( echo "${{ matrix.job.os }}" | sed 's/[^[:alnum:]]/_/g' )
431+ echo set-output name=CODECOV_FLAGS::${CODECOV_FLAGS}
432+ echo ::set-output name=CODECOV_FLAGS::${CODECOV_FLAGS}
433+ - name: rust toolchain ~ install
434+ uses: actions-rs/toolchain@v1
435+ with:
436+ toolchain: ${{ steps.vars.outputs.TOOLCHAIN }}
437+ override: true
438+ profile: minimal # minimal component installation (ie, no documentation)
439+ - name: Test
440+ uses: actions-rs/cargo@v1
441+ with:
442+ command: test
443+ args: --no-fail-fast
444+ env:
445+ CARGO_INCREMENTAL: '0'
446+ RUSTFLAGS: '-Zprofile -Ccodegen-units=1 -Cinline-threshold=0 -Clink-dead-code -Coverflow-checks=off -Zno-landing-pads'
447+ - name: Generate coverage data
448+ id: coverage
449+ uses: actions-rs/grcov@v0.1
450+ - name: Upload coverage results (to Codecov.io)
451+ uses: codecov/codecov-action@v1
452+ with:
453+ file: ${{ steps.coverage.outputs.report }}
454+ flags: ${{ steps.vars.outputs.CODECOV_FLAGS }}
455+ name: codecov-umbrella
456+ fail_ci_if_error: false
.gitignore−1
@@ -2,7 +2,6 @@
2**/*.rs.bk
2**/*.rs.bk
3
3
4# Generated files
4# Generated files
5−/assets/completions/bat.bash
6/assets/completions/bat.fish
5/assets/completions/bat.fish
7/assets/completions/bat.zsh
6/assets/completions/bat.zsh
8/assets/manual/bat.1
7/assets/manual/bat.1
.gitmodules+16−63
@@ -61,12 +61,18 @@
61[submodule "assets/syntaxes/Puppet"]
61[submodule "assets/syntaxes/Puppet"]
62 path = assets/syntaxes/02_Extra/Puppet
62 path = assets/syntaxes/02_Extra/Puppet
63 url = https://github.com/russCloak/SublimePuppet
63 url = https://github.com/russCloak/SublimePuppet
64+[submodule "assets/syntaxes/CSV"]
65+ path = assets/syntaxes/02_Extra/CSV
66+ url = https://github.com/wadetb/Sublime-Text-Advanced-CSV
64[submodule "assets/themes/onehalf"]
67[submodule "assets/themes/onehalf"]
65 path = assets/themes/onehalf
68 path = assets/themes/onehalf
66 url = https://github.com/sonph/onehalf
69 url = https://github.com/sonph/onehalf
67[submodule "assets/syntaxes/JavaScript (Babel)"]
70[submodule "assets/syntaxes/JavaScript (Babel)"]
68 path = assets/syntaxes/02_Extra/JavaScript (Babel)
71 path = assets/syntaxes/02_Extra/JavaScript (Babel)
69 url = https://github.com/babel/babel-sublime
72 url = https://github.com/babel/babel-sublime
73+[submodule "assets/syntaxes/Dart"]
74+ path = assets/syntaxes/02_Extra/Dart
75+ url = https://github.com/guillermooo/dart-sublime-bundle
70[submodule "assets/syntaxes/FSharp"]
76[submodule "assets/syntaxes/FSharp"]
71 path = assets/syntaxes/02_Extra/FSharp
77 path = assets/syntaxes/02_Extra/FSharp
72 url = https://github.com/hoest/sublimetext-fsharp
78 url = https://github.com/hoest/sublimetext-fsharp
@@ -91,6 +97,10 @@
91[submodule "assets/syntaxes/Assembly (ARM)"]
97[submodule "assets/syntaxes/Assembly (ARM)"]
92 path = assets/syntaxes/02_Extra/Assembly (ARM)
98 path = assets/syntaxes/02_Extra/Assembly (ARM)
93 url = https://github.com/tvi/Sublime-ARM-Assembly
99 url = https://github.com/tvi/Sublime-ARM-Assembly
100+[submodule "assets/syntaxes/syslog-syntax"]
101+ path = assets/syntaxes/02_Extra/Syslog
102+ url = https://github.com/caos21/syslog-syntax.git
103+ branch = master
94[submodule "assets/syntaxes/protobuf-syntax-highlighting"]
104[submodule "assets/syntaxes/protobuf-syntax-highlighting"]
95 path = assets/syntaxes/02_Extra/Protobuf
105 path = assets/syntaxes/02_Extra/Protobuf
96 url = https://github.com/VcamX/protobuf-syntax-highlighting.git
106 url = https://github.com/VcamX/protobuf-syntax-highlighting.git
@@ -110,6 +120,9 @@
110[submodule "assets/syntaxes/Org mode"]
120[submodule "assets/syntaxes/Org mode"]
111 path = assets/syntaxes/02_Extra/Org mode
121 path = assets/syntaxes/02_Extra/Org mode
112 url = https://github.com/jezcope/Org.tmbundle.git
122 url = https://github.com/jezcope/Org.tmbundle.git
123+[submodule "assets/syntaxes/requirementstxt"]
124+ path = assets/syntaxes/02_Extra/requirementstxt
125+ url = https://github.com/wuub/requirementstxt
113[submodule "assets/syntaxes/DotENV"]
126[submodule "assets/syntaxes/DotENV"]
114 path = assets/syntaxes/02_Extra/DotENV
127 path = assets/syntaxes/02_Extra/DotENV
115 url = https://github.com/zaynali53/DotENV
128 url = https://github.com/zaynali53/DotENV
@@ -172,6 +185,9 @@
172[submodule "assets/syntaxes/02_Extra/AsciiDoc"]
185[submodule "assets/syntaxes/02_Extra/AsciiDoc"]
173 path = assets/syntaxes/02_Extra/AsciiDoc
186 path = assets/syntaxes/02_Extra/AsciiDoc
174 url = https://github.com/asciidoctor/sublimetext-asciidoc.git
187 url = https://github.com/asciidoctor/sublimetext-asciidoc.git
188+[submodule "assets/themes/gruvbox"]
189+ path = assets/themes/gruvbox
190+ url = https://github.com/peaceant/gruvbox.git
175[submodule "assets/syntaxes/02_Extra/GLSL"]
191[submodule "assets/syntaxes/02_Extra/GLSL"]
176 path = assets/syntaxes/02_Extra/GLSL
192 path = assets/syntaxes/02_Extra/GLSL
177 url = https://github.com/euler0/sublime-glsl
193 url = https://github.com/euler0/sublime-glsl
@@ -181,66 +197,3 @@
181[submodule "assets/syntaxes/02_Extra/Apache"]
197[submodule "assets/syntaxes/02_Extra/Apache"]
182 path = assets/syntaxes/02_Extra/Apache
198 path = assets/syntaxes/02_Extra/Apache
183 url = https://github.com/colinta/ApacheConf.tmLanguage
199 url = https://github.com/colinta/ApacheConf.tmLanguage
184−[submodule "assets/syntaxes/02_Extra/Ninja"]
185− path = assets/syntaxes/02_Extra/Ninja
186− url = https://github.com/pope/SublimeNinja.git
187−[submodule "assets/syntaxes/02_Extra/Svelte"]
188− path = assets/syntaxes/02_Extra/Svelte
189− url = https://github.com/corneliusio/svelte-sublime
190−[submodule "assets/themes/Coldark"]
191− path = assets/themes/Coldark
192− url = https://github.com/ArmandPhilippot/coldark-bat.git
193−[submodule "assets/themes/gruvbox"]
194− path = assets/themes/gruvbox
195− url = https://github.com/subnut/gruvbox-tmTheme.git
196− branch = bat-source
197−[submodule "assets/syntaxes/02_Extra/Lean"]
198− path = assets/syntaxes/02_Extra/Lean
199− url = https://github.com/leanprover/vscode-lean.git
200−[submodule "assets/syntaxes/02_Extra/LiveScript"]
201− path = assets/syntaxes/02_Extra/LiveScript
202− url = https://github.com/paulmillr/LiveScript.tmbundle
203−[submodule "assets/syntaxes/02_Extra/Zig"]
204− path = assets/syntaxes/02_Extra/Zig
205− url = https://github.com/ziglang/sublime-zig-language.git
206−[submodule "assets/syntaxes/02_Extra/gnuplot"]
207− path = assets/syntaxes/02_Extra/gnuplot
208− url = https://github.com/hesstobi/sublime_gnuplot
209−[submodule "assets/syntaxes/02_Extra/SystemVerilog"]
210− path = assets/syntaxes/02_Extra/SystemVerilog
211− url = https://github.com/TheClams/SystemVerilog.git
212−[submodule "assets/themes/visual-studio-dark-plus"]
213− path = assets/themes/visual-studio-dark-plus
214− url = https://github.com/vidann1/visual-studio-dark-plus.git
215−[submodule "assets/syntaxes/02_Extra/SublimeEthereum"]
216− path = assets/syntaxes/02_Extra/SublimeEthereum
217− url = https://github.com/davidhq/SublimeEthereum.git
218−[submodule "assets/syntaxes/02_Extra/Groff"]
219− path = assets/syntaxes/02_Extra/Groff
220− url = https://github.com/carsonoid/sublime_man_page_support
221−[submodule "assets/syntaxes/02_Extra/http-request-response"]
222− path = assets/syntaxes/02_Extra/http-request-response
223− url = https://github.com/keith-hall/http-request-response-syntax.git
224−[submodule "assets/syntaxes/02_Extra/LLVM"]
225− path = assets/syntaxes/02_Extra/LLVM
226− url = https://github.com/ioncodes/LLVM.tmBundle
227−[submodule "assets/syntaxes/02_Extra/Slim"]
228− path = assets/syntaxes/02_Extra/Slim
229− url = https://github.com/slim-template/ruby-slim.tmbundle.git
230−[submodule "assets/syntaxes/02_Extra/Racket"]
231− path = assets/syntaxes/02_Extra/Racket
232− url = https://github.com/follesoe/sublime-racket.git
233−[submodule "assets/syntaxes/02_Extra/MediaWiki"]
234− path = assets/syntaxes/02_Extra/MediaWiki
235− url = https://github.com/tosher/Mediawiker.git
236−[submodule "assets/syntaxes/02_Extra/Dart"]
237− path = assets/syntaxes/02_Extra/Dart
238− url = https://github.com/elMuso/Dartlight.git
239−[submodule "assets/syntaxes/02_Extra/SublimeJQ"]
240− path = assets/syntaxes/02_Extra/SublimeJQ
241− url = https://github.com/zogwarg/SublimeJQ.git
242−[submodule "assets/syntaxes/02_Extra/cmd-help"]
243− path = assets/syntaxes/02_Extra/cmd-help
244− url = https://github.com/victor-gp/cmd-help-sublime-syntax.git
245− branch = main
246− shallow = true
CHANGELOG.md+4−265
@@ -1,283 +1,22 @@
1# unreleased
1# unreleased
2
2
3−## Features
3+- Add Note to refer to see detailed help with --help (and vice versa with -h). see #1215 (@henil)
4−
5−- Make the default macOS theme depend on Dark Mode. See #2197, #1746 (@Enselic)
6−
7−## Bugfixes
8−
9−## Other
10−
11−- Relaxed glibc requirements on amd64, see #2106 and #2194 (@sharkdp)
12−
13−## Syntaxes
14−
15−## Themes
16−
17−## `bat` as a library
18−
19−
20−# v0.21.0
21
4
22## Features
5## Features
23
6
24−- Correctly render tab stops in `--show-all`, see #2038 (@Synthetica9)
7+- Adjust pager configuration to comply with `--wrap=never`, see #1255 (@gahag)
25−- Add a `--style=default` option and make it the default. It is less verbose than `full`, see #2061 (@IsaacHorvath)
26−- Enable BusyBox `less` as pager, see #2162 (@nfisher1226)
27−- File extensions are now matched case-insensitively. See #1854, #2181 (@Enselic)
28
8
29## Bugfixes
9## Bugfixes
30
10
31−- Bump `regex` dependency from 1.5.4 to 1.5.5 to fix [CVE-2022-24713](https://blog.rust-lang.org/2022/03/08/cve-2022-24713.html), see #2145, #2139 (@Enselic)
32−- `bat` no longer crashes when encountering files that references missing syntaxes. See #915, #2181 (@Enselic)
33−
34−## Performance
35−
36−- Skip syntax highlighting on long lines (> 16384 chars) to help improve performance. See #2165 (@keith-hall)
37−- Vastly improve startup time by lazy-loading syntaxes via syntect 5.0.0. This makes bat display small files ~75% faster than before. See #951, #2181 (@Enselic)
38−
39## Other
11## Other
40
12
41−- Include info about custom assets in `--diagnostics` if used. See #2107, #2144 (@Enselic)
42−
43−## Syntaxes
44−
45−- Mapped clang-format config file (.clang-format) to YAML syntax (@TruncatedDinosour)
46−- log syntax: improved handling of escape characters in double quoted strings. See #2123 (@keith-hall)
47−- Associate `/var/spool/mail/*` and `/var/mail/*` with the `Email` syntax. See #2156 (@cyqsimon)
48−- Added cmd-help syntax to scope --help messages. See #2148 (@victor-gp)
49−- Slightly adjust Zig syntax. See #2136 (@Enselic)
50−- Associate `.inf` files with the `INI` syntax. See #2190 (@Enselic)
51−
52−## `bat` as a library
53−
54−- Allow configuration of `show_nonprintable` with `PrettyPrinter`, see #2142
55−- The binary format of syntaxes.bin has been changed due to syntaxes now being lazy-loaded via syntect 5.0.0. See #2181 (@Enselic)
56−- Mark `bat::error::Error` enum as `#[non_exhaustive]` to allow adding new variants without future semver breakage. See #2181 (@Enselic)
57−- Change `Error::SyntectError(syntect::LoadingError)` to `Error::SyntectError(syntect::Error)`. See #2181 (@Enselic)
58−- Add `Error::SyntectLoadingError(syntect::LoadingError)` enum variant. See #2181 (@Enselic)
59−
60−
61−# v0.20.0
62−
63−## Features
64−
65−- New style component `header-filesize` to show size of the displayed file in the header. See #1988 (@mdibaiee)
66−- Use underline for line highlighting on ANSI, see #1730 (@mdibaiee)
67−
68−## Bugfixes
69−
70−- Fix bash completion on bash 3.x and bash-completion 1.x. See #2066 (@joshpencheon)
71−
72## Syntaxes
13## Syntaxes
73
14
74−- `GraphQL`: Add support for interfaces implementing interfaces and consider ampersand an operator. See #2000
75−- Associate `_vimrc` and `_gvimrc` files with the `VimL` syntax. See #2002
76−- Associate `poetry.lock` files with the `TOML` syntax. See #2049
77−- Associate `.mesh`, `.task`, `.rgen`, `.rint`, `.rahit`, `.rchit`, `.rmiss`, and `.rcall` with the `GLSL` syntax. See #2050
78−- Added support for `JQ` syntax, see #2072
79−- Properly associate global git config files rooted in `$XDG_CONFIG_HOME/git/` or `$HOME/.config/git/`. See #2067 (@cyqsimon)
80−
81−## `bat` as a library
82−
83−- Exposed `get_syntax_set` and `get_theme` methods on `HighlightingAssets`. See #2030 (@dandavison)
84−- Added `HeaderFilename` and `HeaderFilesize` to `StyleComponent` enum, and mark it `#[non_exhaustive]`. See #1988 (@mdibaiee)
85−
86−
87−# v0.19.0
88−
89−## Performance
90−
91−- Reduce startup time in loop-through mode (e.g. when redirecting output) by 90%. See #1747 (@Enselic)
92−- Load themes lazily to make bat start 25% faster when disregarding syntax load time. See #1969 (@Enselic)
93−- Python syntax highlighting no longer suffers from abysmal performance in specific scenarios. See #1688 (@keith-hall)
94−- Fix for poor performance when ANSI escape sequences are piped to `bat`, see #1596 (@eth-p)
95−- Fix for incorrect handling of ANSI escape sequences when using `--wrap=never`, see #1596 (@eth-p)
96−- Load custom assets as fast as integrated assets, see #1753 (@Enselic)
97−
98−## Features
99−
100−- Support for `x:-delta` (minus) syntax in line ranges (e.g. `20:-10`). See #1901 (@bojan88)
101−- Support for `--ignored-suffix` argument. See #1892 (@bojan88)
102−- `$BAT_CONFIG_DIR` is now a recognized environment variable. It has precedence over `$XDG_CONFIG_HOME`, see #1727 (@billrisher)
103−- Support for `x:+delta` syntax in line ranges (e.g. `20:+10`). See #1810 (@bojan88)
104−- Add new `--acknowledgements` option that gives credit to theme and syntax definition authors. See #1971 (@Enselic)
105−- Include git hash in `bat -V` and `bat --version` output if present. See #1921 (@Enselic)
106−
107−## Bugfixes
108−
109−- First line not shown in diff context. See #1891 (@divagant-martian)
110−- Do not ignore syntaxes that handle file names with a `*.conf` extension. See #1703 (@cbolgiano)
111−
112−## Other
113−
114−- Add PowerShell completion, see #1826 (@rashil2000)
115−- Minimum supported Rust version (MSRV) bumped to 1.51, see #1994 (@mdibaiee)
116−
117−## Syntaxes
118−
119−- Groff, see #1685 (@scop)
120−- HTTP Requests and Responses, see #1748 (@keith-hall)
121−- LLVM, see #1777 (@ioncodes)
122−- Highlight for `vimrc` and `gvimrc` files, see #1763 (@SuperSandro2000)
123−- Syslog highlighting improvements, see #1793 (@scop)
124−- Added support for `slim` syntax, see #1693 (@mfinelli)
125−- Racket, see #1884 (@jubnzv)
126−- LiveScript, see #1915 (@Enselic)
127−- MediaWiki, see #1925 (@sorairolake)
128−- The `requirements.txt` syntax has been removed due to incompatible license requirements.
129−- Dart, new highlighter, see #1959 (@Ersikan)
130−- SCSS and Sass syntaxes updated, see #1766 (@Enselic)
131−- PowerShell syntax updated, see #1935 (@Enselic)
132−- TypeScript syntax updated, see #1834 (@Enselic)
133−
134−## `bat` as a library
135−
136−- Deprecate `HighlightingAssets::syntaxes()` and `HighlightingAssets::syntax_for_file_name()`. Use `HighlightingAssets::get_syntaxes()` and `HighlightingAssets::get_syntax_for_path()` instead. They return a `Result` which is needed for upcoming lazy-loading work to improve startup performance. They also return which `SyntaxSet` the returned `SyntaxReference` belongs to. See #1747, #1755, #1776, #1862 (@Enselic)
137−- Remove `HighlightingAssets::from_files` and `HighlightingAssets::save_to_cache`. Instead of calling the former and then the latter you now make a single call to `bat::assets::build`. See #1802, #1971 (@Enselic)
138−- Replace the `error::Error(error::ErrorKind, _)` struct and enum with an `error::Error` enum. `Error(ErrorKind::UnknownSyntax, _)` becomes `Error::UnknownSyntax`, etc. Also remove the `error::ResultExt` trait. These changes stem from replacing `error-chain` with `thiserror`. See #1820 (@Enselic)
139−- Add new `MappingTarget` enum variant `MapExtensionToUnknown`. Refer to its documentation for more information. Also mark `MappingTarget` as `#[non_exhaustive]` since more enum variants might be added in the future. See #1703 (@cbolgiano), #2012 (@Enselic)
140−
141−
142−# v0.18.3
143−
144−## Bugfixes
145−
146−- Bump `git2` dependency to fix build with Rust 1.54, see #1761
147−
148−
149−# v0.18.2
150−
151−## Features
152−
153−- Ignore known backup/template filename suffixes when selecting the syntax, see #1687 (@scop)
154−
155−## Bugfixes
156−
157−- Fix for a security vulnerability on Windows. Prior to this release, `bat` would execute programs called `less`/`less.exe` from the current working directory (instead of the one from `PATH`) with priority. An attacker might be able to use this by placing a malicious program in a shared directory where the user would execute `bat`. `bat` users on Windows are advised to upgrade to this version. See #1724 and #1472 (@Ry0taK).
158−
159−## Other
160−
161−- Add bash completion, see #1678 (@scop)
162−- Fix Clippy lints, see #1661 (@mohamed-abdelnour)
163−- Add syntax highlighting test files, see #1213 and #1668 (@mohamed-abdelnour)
164−
165−## Syntaxes
166−
167−- Upgraded Julia syntax to fix a highlighting bug, see #1692
168−- Added support for `dash` syntax, see #1654 (@mohamed-abdelnour)
169−- Added support for `XAML` syntax, see #1590 and #1655 (@mohamed-abdelnour)
170−- Apply `DotENV` syntax also for `.env.default` and `.env.defaults` files, see #1669
171−
172−
173−# v0.18.1
174−
175−## Bugfixes
176−
177−- Mouse support and screen clearing broken for `less` versions with minor version number (581.2), see #1629 and #1639 (@aswild)
178−
179−## Other
180−
181−- `Input::ordinary_file` and `Input::with_name` now accept `Path` rather than `OsStr` see #1571 (@matklad)
182−- The `LESS` environment variable is now included in `bat --diagnostic`, see #1589 (@Enselic)
183−- Increased min. required Rust version to 1.45
184−
185−## Syntaxes
186−
187−- Improved the Syslog syntax highlighting, see #1606 (@keith-hall)
188−- Replaced "Advanced CSV" with a custom CSV syntax definition written especially for `bat`; see #1574 (@keith-hall)
189−- Added SystemVerilog file syntax, see #1580 (@SeanMcLoughlin)
190−- Added Solidity and Vyper syntax, see #1602 (@Ersikan)
191−
192−## New themes
193−
194−- Dark+ VS Code theme, see #1588 and #1598 (@PatriotRossii)
195−
196−
197−
198−# v0.18.0
199−
200−## Features
201−
202−- Use a pager when `bat --list-languages` is called, see #1394 (@stku1985)
203−
204−## Bugfixes
205−
206−- If the last line doesn't end with a newline character, don't add it if `--style=plain`, see #1438 (@Enselic)
207−- Only print themes hint in interactive mode (`bat --list-themes`), see #1439 (@rsteube)
208−- Make ./tests/syntax-tests/regression_test.sh work on recent versions of macOS, see #1443 (@Enselic)
209−- VimL syntax highlighting fix, see #1450 (@esensar)
210−- Print an 'Invalid syntax theme settings' error message if a custom theme is broken, see #614 (@Enselic)
211−- If plain mode is set and wrap is not explicitly opted in, long lines will no be truncated, see #1426
212−- If `PAGER` (but not `BAT_PAGER` or `--pager`) is `more` or `most`, silently use `less` instead to ensure support for colors, see #1063 (@Enselic)
213−- If `PAGER` is `bat`, silently use `less` to prevent recursion. For `BAT_PAGER` or `--pager`, exit with error, see #1413 (@Enselic)
214−- Manpage highlighting fix, see #1511 (@keith-hall)
215−- `BAT_CONFIG_PATH` ignored by `bat` if non-existent, see #1550 (@sharkdp)
216−
217−## Other
218−
219−- Performance improvements, see #1421 (@LovecraftianHorror)
220−- Added a new `--diagnostic` option to collect information for bug reports, see #1459 (@sharkdp)
221−- Modified default theme colors to differentiate between a JSON key and a string value, see #1400 (@keith-hall)
222−- Upped min required Rust version to 1.42
223−
224−## Syntaxes
225−
226−- Added Zig syntax, see #1470 (@paulsmith)
227−- Added Lean syntax, see #1446 (@Julian)
228−- Added `.resource` extension for Robot Framework files, see #1386
229−- Added `gnuplot` syntax, see #1431 (@sharkdp)
230−- Highlight *.pac (Proxy auto-config) files as JavaScript, see #1515 (@sharkdp)
231−
232## New themes
15## New themes
233
16
234−- `ansi` replaces `ansi-dark` and `ansi-light`, see #1104 and #1412 (@mk12). **Breaking change:** users that were previously using one of the `ansi-*` themes should switch to `ansi`.
235−- The Gruvbox theme has been updated, see #1291 (@j0hnmeow). **Breaking change:** users that were previously using `gruvbox` or `gruvbox-white` should update and use `gruvbox-dark`/`gruvbox-light` instead.
236−
237## `bat` as a library
17## `bat` as a library
238
18
239−- The following `PrettyPrinter` methods have been removed (they were previously deprecated):
19+## Packaging
240− - `input_stdin_with_name`
241− - `input_from_bytes_with_name`
242− - `input_from_reader_with_name`
243− - `vcs_modification_markers` (if the `git` feature is not enabled)
244−
245−
246−# v0.17.1
247−
248−## Bugfixes
249−
250−- Running `bat` without arguments fails ("output file is also an input"), see #1396
251−
252−
253−# v0.17.0
254−
255−## Features
256−
257−- Added a new `--style` value, `rule`, which adds a simple horizontal ruled line between files, see #1276 (@tommilligan)
258−- Pass `-S` ("chop long lines") to `less` if `--wrap=never` is set in `bat`, see #1255 (@gahag)
259−
260−## Bugfixes
261−
262−- Detect infinite loop when input and output are the same, see #1193 and #1197 (@niklasmohrin)
263−- Throw an error when `bat` is being used as `pager`, see #1343 (@adrian-rivera)
264−- Bash syntax highlighting not selected for `*.ebuild` and `*.eclass` files, see #1292 (@sharkdp)
265−- Fix `zsh` completion when using `-p`, see #1320 (@xzfc)
266−
267−## Other
268−
269−- Add note to refer to see detailed help with `--help` (and vice versa with `-h`), see #1215 (@henil)
270−- Add a `Contributors` section to `README`, see #1348 (@adrian-rivera)
271−
272−## Syntaxes
273−
274−- Manpage syntax highlighting has been improved, see #1315 (@keith-hall)
275−- Add Svelte file syntax, see #1285 (@kjmph)
276−
277−## New themes
278−
279−- Coldark, see #1329 (@armandphilippot)
280−
281
20
282# v0.16.0
21# v0.16.0
283
22
@@ -685,7 +424,7 @@ You can see the API documentation here: https://docs.rs/bat/
685
424
686- Added `BAT_CONFIG_PATH` environment variable to set a non-default path for `bat`s configuration file, see #375 (@deg4uss3r)
425- Added `BAT_CONFIG_PATH` environment variable to set a non-default path for `bat`s configuration file, see #375 (@deg4uss3r)
687
426
688−- Allow for multiple occurrences of `--style` to allow for the configuration
427+- Allow for multiple occurences of `--style` to allow for the configuration
689 of styles from the config file, see #367 (@sindreij)
428 of styles from the config file, see #367 (@sindreij)
690
429
691- Allow for multiple `--line-range` arguments, see #23
430- Allow for multiple `--line-range` arguments, see #23
CONTRIBUTING.mddeleted−70
@@ -1,70 +0,0 @@
1−# Contributing
2−
3−Thank you for considering to contribute to `bat`!
4−
5−
6−
7−## Add an entry to the changelog
8−
9−If your contribution changes the behavior of `bat` (as opposed to a typo-fix
10−in the documentation), please update the [`CHANGELOG.md`](CHANGELOG.md) file
11−and describe your changes. This makes the release process much easier and
12−therefore helps to get your changes into a new `bat` release faster.
13−
14−The top of the `CHANGELOG` contains a *"unreleased"* section with a few
15−subsections (Features, Bugfixes, …). Please add your entry to the subsection
16−that best describes your change.
17−
18−Entries follow this format:
19−```
20−- Short description of what has been changed, see #123 (@user)
21−```
22−Here, `#123` is the number of the original issue and/or your pull request.
23−Please replace `@user` by your GitHub username.
24−
25−
26−## Development
27−
28−Please check out the [Development](https://github.com/sharkdp/bat#development)
29−section in the README.
30−
31−
32−## Adding a new feature
33−
34−Please consider opening a
35−[feature request ticket](https://github.com/sharkdp/bat/issues/new?assignees=&labels=feature-request&template=feature_request.md)
36−first in order to give us a chance to discuss the feature first.
37−
38−
39−## Adding new syntaxes/languages or themes
40−
41−Before you make a pull request that adds a new syntax or theme, please read
42−the [Customization](https://github.com/sharkdp/bat#customization) section
43−in the README first.
44−
45−If you really think that a particular syntax or theme should be added for all
46−users, please read the corresponding
47−[documentation](https://github.com/sharkdp/bat/blob/master/doc/assets.md)
48−first.
49−
50−
51−## Regression tests
52−
53−You are strongly encouraged to add regression tests. Regression tests are great,
54−not least because they:
55−
56−* ensure that your contribution will never completely stop working,
57−
58−* makes code review easier, because it becomes very clear what the code is
59− supposed to do.
60−
61−For functional changes, you most likely want to add a test to
62−[`tests/integration_tests.rs`](https://github.com/sharkdp/bat/blob/master/tests/integration_tests.rs).
63−Look at existing tests to know how to write a new test. In short, you will
64−invoke the `bat` binary with a certain set of arguments, and then assert on
65−stdout/stderr.
66−
67−To learn how to write regression tests for theme and syntax changes, read the
68−[Syntax
69−tests](https://github.com/sharkdp/bat/blob/master/doc/assets.md#syntax-tests)
70−section in `assets.md`.
Cargo.lock+629−658
@@ -1,1340 +1,1311 @@
1# This file is automatically @generated by Cargo.
1# This file is automatically @generated by Cargo.
2# It is not intended for manual editing.
2# It is not intended for manual editing.
3−version = 3
4−
5[[package]]
3[[package]]
6name = "adler"
4name = "adler"
7−version = "1.0.2"
5+version = "0.2.3"
8source = "registry+https://github.com/rust-lang/crates.io-index"
6source = "registry+https://github.com/rust-lang/crates.io-index"
9−checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
10
7
11[[package]]
8[[package]]
12name = "aho-corasick"
9name = "aho-corasick"
13−version = "0.7.18"
10+version = "0.7.13"
14source = "registry+https://github.com/rust-lang/crates.io-index"
11source = "registry+https://github.com/rust-lang/crates.io-index"
15−checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f"
16dependencies = [
12dependencies = [
17− "memchr",
13+ "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
18]
14]
19
15
20[[package]]
16[[package]]
21name = "ansi_colours"
17name = "ansi_colours"
22−version = "1.1.1"
18+version = "1.0.1"
23source = "registry+https://github.com/rust-lang/crates.io-index"
19source = "registry+https://github.com/rust-lang/crates.io-index"
24−checksum = "32678233b67f9056b0c144b39d46dc3218637e8d84ad6038ded339e08b19620d"
25dependencies = [
20dependencies = [
26− "rgb",
21+ "cc 1.0.60 (registry+https://github.com/rust-lang/crates.io-index)",
22+]
23+
24+[[package]]
25+name = "ansi_term"
26+version = "0.11.0"
27+source = "registry+https://github.com/rust-lang/crates.io-index"
28+dependencies = [
29+ "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
27]
30]
28
31
29[[package]]
32[[package]]
30name = "ansi_term"
33name = "ansi_term"
31version = "0.12.1"
34version = "0.12.1"
32source = "registry+https://github.com/rust-lang/crates.io-index"
35source = "registry+https://github.com/rust-lang/crates.io-index"
33−checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2"
34dependencies = [
36dependencies = [
35− "winapi",
37+ "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
36]
38]
37
39
40+[[package]]
41+name = "arrayref"
42+version = "0.3.6"
43+source = "registry+https://github.com/rust-lang/crates.io-index"
44+
45+[[package]]
46+name = "arrayvec"
47+version = "0.5.1"
48+source = "registry+https://github.com/rust-lang/crates.io-index"
49+
38[[package]]
50[[package]]
39name = "assert_cmd"
51name = "assert_cmd"
40−version = "2.0.4"
52+version = "1.0.1"
41source = "registry+https://github.com/rust-lang/crates.io-index"
53source = "registry+https://github.com/rust-lang/crates.io-index"
42−checksum = "93ae1ddd39efd67689deb1979d80bad3bf7f2b09c6e6117c8d1f2443b5e2f83e"
43dependencies = [
54dependencies = [
44− "bstr",
55+ "doc-comment 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
45− "doc-comment",
56+ "predicates 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
46− "predicates",
57+ "predicates-core 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
47− "predicates-core",
58+ "predicates-tree 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
48− "predicates-tree",
59+ "wait-timeout 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
49− "wait-timeout",
50]
60]
51
61
52[[package]]
62[[package]]
53name = "atty"
63name = "atty"
54version = "0.2.14"
64version = "0.2.14"
55source = "registry+https://github.com/rust-lang/crates.io-index"
65source = "registry+https://github.com/rust-lang/crates.io-index"
56−checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
57dependencies = [
66dependencies = [
58− "hermit-abi",
67+ "hermit-abi 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)",
59− "libc",
68+ "libc 0.2.78 (registry+https://github.com/rust-lang/crates.io-index)",
60− "winapi",
69+ "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
61]
70]
62
71
63[[package]]
72[[package]]
64name = "autocfg"
73name = "autocfg"
65version = "1.0.1"
74version = "1.0.1"
66source = "registry+https://github.com/rust-lang/crates.io-index"
75source = "registry+https://github.com/rust-lang/crates.io-index"
67−checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a"
68
76
69[[package]]
77[[package]]
70name = "base64"
78name = "base64"
71−version = "0.13.0"
79+version = "0.12.3"
72source = "registry+https://github.com/rust-lang/crates.io-index"
80source = "registry+https://github.com/rust-lang/crates.io-index"
73−checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd"
74
81
75[[package]]
82[[package]]
76name = "bat"
83name = "bat"
77−version = "0.21.0"
84+version = "0.16.0"
78−dependencies = [
85+dependencies = [
79− "ansi_colours",
86+ "ansi_colours 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
80− "ansi_term",
87+ "ansi_term 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)",
81− "assert_cmd",
88+ "assert_cmd 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
82− "atty",
89+ "atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)",
83− "bincode",
90+ "clap 2.33.3 (registry+https://github.com/rust-lang/crates.io-index)",
84− "bugreport",
91+ "console 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)",
85− "bytesize",
86− "clap",
87− "clircle",
88− "console",
89− "content_inspector",
92+ "content_inspector 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
90− "dirs-next",
93+ "dirs 3.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
91− "encoding",
94+ "encoding 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
92− "flate2",
95+ "error-chain 0.12.4 (registry+https://github.com/rust-lang/crates.io-index)",
93− "git2",
96+ "git2 0.13.11 (registry+https://github.com/rust-lang/crates.io-index)",
94− "globset",
97+ "globset 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
95− "grep-cli",
98+ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
96− "nix",
99+ "path_abs 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
97− "once_cell",
100+ "predicates 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
98− "path_abs",
101+ "semver 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
99− "predicates",
102+ "serde 1.0.116 (registry+https://github.com/rust-lang/crates.io-index)",
100− "regex",
103+ "serde_yaml 0.8.13 (registry+https://github.com/rust-lang/crates.io-index)",
101− "semver",
104+ "shell-words 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
102− "serde",
105+ "syntect 4.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
103− "serde_yaml",
106+ "tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
104− "serial_test",
107+ "unicode-width 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
105− "shell-words",
108+ "wild 2.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
106− "syntect",
107− "tempfile",
108− "thiserror",
109− "unicode-width",
110− "wait-timeout",
111− "walkdir",
112− "wild",
113]
109]
114
110
115[[package]]
111[[package]]
116name = "bincode"
112name = "bincode"
117−version = "1.3.3"
113+version = "1.3.1"
118source = "registry+https://github.com/rust-lang/crates.io-index"
114source = "registry+https://github.com/rust-lang/crates.io-index"
119−checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad"
120dependencies = [
115dependencies = [
121− "serde",
116+ "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
117+ "serde 1.0.116 (registry+https://github.com/rust-lang/crates.io-index)",
122]
118]
123
119
124[[package]]
120[[package]]
125name = "bit-set"
121name = "bit-set"
126version = "0.5.2"
122version = "0.5.2"
127source = "registry+https://github.com/rust-lang/crates.io-index"
123source = "registry+https://github.com/rust-lang/crates.io-index"
128−checksum = "6e11e16035ea35e4e5997b393eacbf6f63983188f7a2ad25bfb13465f5ad59de"
129dependencies = [
124dependencies = [
130− "bit-vec",
125+ "bit-vec 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
131]
126]
132
127
133[[package]]
128[[package]]
134name = "bit-vec"
129name = "bit-vec"
135−version = "0.6.3"
130+version = "0.6.2"
136source = "registry+https://github.com/rust-lang/crates.io-index"
131source = "registry+https://github.com/rust-lang/crates.io-index"
137−checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb"
138
132
139[[package]]
133[[package]]
140name = "bitflags"
134name = "bitflags"
141−version = "1.3.2"
135+version = "1.2.1"
142source = "registry+https://github.com/rust-lang/crates.io-index"
136source = "registry+https://github.com/rust-lang/crates.io-index"
143−checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
144
137
145[[package]]
138[[package]]
146−name = "bstr"
139+name = "blake2b_simd"
147−version = "0.2.17"
140+version = "0.5.10"
148source = "registry+https://github.com/rust-lang/crates.io-index"
141source = "registry+https://github.com/rust-lang/crates.io-index"
149−checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223"
150dependencies = [
142dependencies = [
151− "lazy_static",
143+ "arrayref 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
152− "memchr",
144+ "arrayvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
153− "regex-automata",
145+ "constant_time_eq 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
154]
146]
155
147
156[[package]]
148[[package]]
157−name = "bugreport"
149+name = "block-buffer"
158−version = "0.5.0"
150+version = "0.7.3"
159source = "registry+https://github.com/rust-lang/crates.io-index"
151source = "registry+https://github.com/rust-lang/crates.io-index"
160−checksum = "535120b8182547808081a66f1f77a64533c780b23da26763e0ee34dfb94f98c9"
161dependencies = [
152dependencies = [
162− "git-version",
153+ "block-padding 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
163− "shell-escape",
154+ "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
164− "sys-info",
155+ "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
156+ "generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)",
165]
157]
166
158
167[[package]]
159[[package]]
168−name = "bytemuck"
160+name = "block-padding"
169−version = "1.7.3"
161+version = "0.1.5"
170source = "registry+https://github.com/rust-lang/crates.io-index"
162source = "registry+https://github.com/rust-lang/crates.io-index"
171−checksum = "439989e6b8c38d1b6570a384ef1e49c8848128f5a97f3914baef02920842712f"
163+dependencies = [
164+ "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
165+]
172
166
173[[package]]
167[[package]]
174−name = "bytesize"
168+name = "bstr"
169+version = "0.2.13"
170+source = "registry+https://github.com/rust-lang/crates.io-index"
171+dependencies = [
172+ "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
173+]
174+
175+[[package]]
176+name = "byte-tools"
175−version = "1.1.0"
177+version = "0.3.1"
178+source = "registry+https://github.com/rust-lang/crates.io-index"
179+
180+[[package]]
181+name = "byteorder"
182+version = "1.3.4"
176source = "registry+https://github.com/rust-lang/crates.io-index"
183source = "registry+https://github.com/rust-lang/crates.io-index"
177−checksum = "6c58ec36aac5066d5ca17df51b3e70279f5670a72102f5752cb7e7c856adfc70"
178
184
179[[package]]
185[[package]]
180name = "cc"
186name = "cc"
181−version = "1.0.72"
187+version = "1.0.60"
182source = "registry+https://github.com/rust-lang/crates.io-index"
188source = "registry+https://github.com/rust-lang/crates.io-index"
183−checksum = "22a9137b95ea06864e018375b72adfb7db6e6f68cfc8df5a04d00288050485ee"
184dependencies = [
189dependencies = [
185− "jobserver",
190+ "jobserver 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)",
186]
191]
187
192
188[[package]]
193[[package]]
189name = "cfg-if"
194name = "cfg-if"
190−version = "1.0.0"
195+version = "0.1.10"
191source = "registry+https://github.com/rust-lang/crates.io-index"
196source = "registry+https://github.com/rust-lang/crates.io-index"
192−checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
193
197
194[[package]]
198[[package]]
195−name = "clap"
199+name = "chrono"
196−version = "2.34.0"
200+version = "0.4.19"
197source = "registry+https://github.com/rust-lang/crates.io-index"
201source = "registry+https://github.com/rust-lang/crates.io-index"
198−checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c"
199dependencies = [
202dependencies = [
200− "ansi_term",
203+ "num-integer 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)",
201− "atty",
204+ "num-traits 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)",
202− "bitflags",
203− "strsim",
204− "term_size",
205− "textwrap",
206− "unicode-width",
207− "vec_map",
208]
205]
209
206
210[[package]]
207[[package]]
211−name = "clircle"
208+name = "clap"
212−version = "0.3.0"
209+version = "2.33.3"
213source = "registry+https://github.com/rust-lang/crates.io-index"
210source = "registry+https://github.com/rust-lang/crates.io-index"
214−checksum = "e68bbd985a63de680ab4d1ad77b6306611a8f961b282c8b5ab513e6de934e396"
215dependencies = [
211dependencies = [
216− "cfg-if",
212+ "ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
217− "libc",
213+ "atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)",
218− "serde",
214+ "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
219− "winapi",
215+ "strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
216+ "term_size 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
217+ "textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
218+ "unicode-width 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
219+ "vec_map 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)",
220]
220]
221
221
222[[package]]
222[[package]]
223name = "console"
223name = "console"
224−version = "0.15.0"
224+version = "0.12.0"
225source = "registry+https://github.com/rust-lang/crates.io-index"
225source = "registry+https://github.com/rust-lang/crates.io-index"
226−checksum = "a28b32d32ca44b70c3e4acd7db1babf555fa026e385fb95f18028f88848b3c31"
227dependencies = [
226dependencies = [
228− "encode_unicode",
227+ "encode_unicode 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
229− "libc",
228+ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
230− "once_cell",
229+ "libc 0.2.78 (registry+https://github.com/rust-lang/crates.io-index)",
231− "regex",
230+ "regex 1.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
232− "terminal_size",
231+ "terminal_size 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)",
233− "unicode-width",
232+ "termios 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
234− "winapi",
233+ "unicode-width 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
234+ "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
235+ "winapi-util 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
235]
236]
236
237
238+[[package]]
239+name = "constant_time_eq"
240+version = "0.1.5"
241+source = "registry+https://github.com/rust-lang/crates.io-index"
242+
237[[package]]
243[[package]]
238name = "content_inspector"
244name = "content_inspector"
239version = "0.2.4"
245version = "0.2.4"
240source = "registry+https://github.com/rust-lang/crates.io-index"
246source = "registry+https://github.com/rust-lang/crates.io-index"
241−checksum = "b7bda66e858c683005a53a9a60c69a4aca7eeaa45d124526e389f7aec8e62f38"
242dependencies = [
247dependencies = [
243− "memchr",
248+ "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
244]
249]
245
250
246[[package]]
251[[package]]
247name = "crc32fast"
252name = "crc32fast"
248−version = "1.3.0"
253+version = "1.2.0"
249source = "registry+https://github.com/rust-lang/crates.io-index"
254source = "registry+https://github.com/rust-lang/crates.io-index"
250−checksum = "738c290dfaea84fc1ca15ad9c168d083b05a714e1efddd8edaab678dc28d2836"
251dependencies = [
255dependencies = [
252− "cfg-if",
256+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
253]
257]
254
258
255[[package]]
259[[package]]
256−name = "difflib"
260+name = "crossbeam-utils"
257−version = "0.4.0"
261+version = "0.7.2"
258source = "registry+https://github.com/rust-lang/crates.io-index"
262source = "registry+https://github.com/rust-lang/crates.io-index"
259−checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8"
263+dependencies = [
264+ "autocfg 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
265+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
266+ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
267+]
260
268
261[[package]]
269[[package]]
262−name = "dirs-next"
270+name = "difference"
263version = "2.0.0"
271version = "2.0.0"
264source = "registry+https://github.com/rust-lang/crates.io-index"
272source = "registry+https://github.com/rust-lang/crates.io-index"
265−checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1"
273+
274+[[package]]
275+name = "digest"
276+version = "0.8.1"
277+source = "registry+https://github.com/rust-lang/crates.io-index"
266dependencies = [
278dependencies = [
267− "cfg-if",
279+ "generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)",
268− "dirs-sys-next",
269]
280]
270
281
271[[package]]
282[[package]]
272−name = "dirs-sys-next"
283+name = "dirs"
273−version = "0.1.2"
284+version = "3.0.1"
285+source = "registry+https://github.com/rust-lang/crates.io-index"
286+dependencies = [
287+ "dirs-sys 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
288+]
289+
290+[[package]]
291+name = "dirs-sys"
292+version = "0.3.5"
274source = "registry+https://github.com/rust-lang/crates.io-index"
293source = "registry+https://github.com/rust-lang/crates.io-index"
275−checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d"
276dependencies = [
294dependencies = [
277− "libc",
295+ "libc 0.2.78 (registry+https://github.com/rust-lang/crates.io-index)",
278− "redox_users",
296+ "redox_users 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
279− "winapi",
297+ "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
280]
298]
281
299
282[[package]]
300[[package]]
283name = "doc-comment"
301name = "doc-comment"
284version = "0.3.3"
302version = "0.3.3"
285source = "registry+https://github.com/rust-lang/crates.io-index"
303source = "registry+https://github.com/rust-lang/crates.io-index"
286−checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10"
287
304
288[[package]]
305[[package]]
289−name = "either"
306+name = "dtoa"
290−version = "1.6.1"
307+version = "0.4.6"
291source = "registry+https://github.com/rust-lang/crates.io-index"
308source = "registry+https://github.com/rust-lang/crates.io-index"
292−checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457"
293
309
294[[package]]
310[[package]]
295name = "encode_unicode"
311name = "encode_unicode"
296version = "0.3.6"
312version = "0.3.6"
297source = "registry+https://github.com/rust-lang/crates.io-index"
313source = "registry+https://github.com/rust-lang/crates.io-index"
298−checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f"
299
314
300[[package]]
315[[package]]
301name = "encoding"
316name = "encoding"
302version = "0.2.33"
317version = "0.2.33"
303source = "registry+https://github.com/rust-lang/crates.io-index"
318source = "registry+https://github.com/rust-lang/crates.io-index"
304−checksum = "6b0d943856b990d12d3b55b359144ff341533e516d94098b1d3fc1ac666d36ec"
305dependencies = [
319dependencies = [
306− "encoding-index-japanese",
320+ "encoding-index-japanese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)",
307− "encoding-index-korean",
321+ "encoding-index-korean 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)",
308− "encoding-index-simpchinese",
322+ "encoding-index-simpchinese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)",
309− "encoding-index-singlebyte",
323+ "encoding-index-singlebyte 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)",
310− "encoding-index-tradchinese",
324+ "encoding-index-tradchinese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)",
311]
325]
312
326
313[[package]]
327[[package]]
314name = "encoding-index-japanese"
328name = "encoding-index-japanese"
315version = "1.20141219.5"
329version = "1.20141219.5"
316source = "registry+https://github.com/rust-lang/crates.io-index"
330source = "registry+https://github.com/rust-lang/crates.io-index"
317−checksum = "04e8b2ff42e9a05335dbf8b5c6f7567e5591d0d916ccef4e0b1710d32a0d0c91"
318dependencies = [
331dependencies = [
319− "encoding_index_tests",
332+ "encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
320]
333]
321
334
322[[package]]
335[[package]]
323name = "encoding-index-korean"
336name = "encoding-index-korean"
324version = "1.20141219.5"
337version = "1.20141219.5"
325source = "registry+https://github.com/rust-lang/crates.io-index"
338source = "registry+https://github.com/rust-lang/crates.io-index"
326−checksum = "4dc33fb8e6bcba213fe2f14275f0963fd16f0a02c878e3095ecfdf5bee529d81"
327dependencies = [
339dependencies = [
328− "encoding_index_tests",
340+ "encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
329]
341]
330
342
331[[package]]
343[[package]]
332name = "encoding-index-simpchinese"
344name = "encoding-index-simpchinese"
333version = "1.20141219.5"
345version = "1.20141219.5"
334source = "registry+https://github.com/rust-lang/crates.io-index"
346source = "registry+https://github.com/rust-lang/crates.io-index"
335−checksum = "d87a7194909b9118fc707194baa434a4e3b0fb6a5a757c73c3adb07aa25031f7"
336dependencies = [
347dependencies = [
337− "encoding_index_tests",
348+ "encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
338]
349]
339
350
340[[package]]
351[[package]]
341name = "encoding-index-singlebyte"
352name = "encoding-index-singlebyte"
342version = "1.20141219.5"
353version = "1.20141219.5"
343source = "registry+https://github.com/rust-lang/crates.io-index"
354source = "registry+https://github.com/rust-lang/crates.io-index"
344−checksum = "3351d5acffb224af9ca265f435b859c7c01537c0849754d3db3fdf2bfe2ae84a"
345dependencies = [
355dependencies = [
346− "encoding_index_tests",
356+ "encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
347]
357]
348
358
349[[package]]
359[[package]]
350name = "encoding-index-tradchinese"
360name = "encoding-index-tradchinese"
351version = "1.20141219.5"
361version = "1.20141219.5"
352source = "registry+https://github.com/rust-lang/crates.io-index"
362source = "registry+https://github.com/rust-lang/crates.io-index"
353−checksum = "fd0e20d5688ce3cab59eb3ef3a2083a5c77bf496cb798dc6fcdb75f323890c18"
354dependencies = [
363dependencies = [
355− "encoding_index_tests",
364+ "encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
356]
365]
357
366
358[[package]]
367[[package]]
359name = "encoding_index_tests"
368name = "encoding_index_tests"
360version = "0.1.4"
369version = "0.1.4"
361source = "registry+https://github.com/rust-lang/crates.io-index"
370source = "registry+https://github.com/rust-lang/crates.io-index"
362−checksum = "a246d82be1c9d791c5dfde9a2bd045fc3cbba3fa2b11ad558f27d01712f00569"
363
371
364[[package]]
372[[package]]
365−name = "fancy-regex"
373+name = "error-chain"
366−version = "0.7.1"
374+version = "0.12.4"
367source = "registry+https://github.com/rust-lang/crates.io-index"
375source = "registry+https://github.com/rust-lang/crates.io-index"
368−checksum = "9d6b8560a05112eb52f04b00e5d3790c0dd75d9d980eb8a122fb23b92a623ccf"
369dependencies = [
376dependencies = [
370− "bit-set",
377+ "version_check 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)",
371− "regex",
372]
378]
373
379
374[[package]]
380[[package]]
375−name = "fastrand"
381+name = "fake-simd"
376−version = "1.7.0"
382+version = "0.1.2"
383+source = "registry+https://github.com/rust-lang/crates.io-index"
384+
385+[[package]]
386+name = "fancy-regex"
387+version = "0.3.5"
377source = "registry+https://github.com/rust-lang/crates.io-index"
388source = "registry+https://github.com/rust-lang/crates.io-index"
378−checksum = "c3fcf0cee53519c866c09b5de1f6c56ff9d647101f81c1964fa632e148896cdf"
379dependencies = [
389dependencies = [
380− "instant",
390+ "bit-set 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
391+ "regex 1.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
381]
392]
382
393
383[[package]]
394[[package]]
384name = "flate2"
395name = "flate2"
385−version = "1.0.23"
396+version = "1.0.18"
386source = "registry+https://github.com/rust-lang/crates.io-index"
397source = "registry+https://github.com/rust-lang/crates.io-index"
387−checksum = "b39522e96686d38f4bc984b9198e3a0613264abaebaff2c5c918bfa6b6da09af"
388dependencies = [
398dependencies = [
389− "cfg-if",
399+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
390− "crc32fast",
400+ "crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
391− "libc",
401+ "libc 0.2.78 (registry+https://github.com/rust-lang/crates.io-index)",
392− "miniz_oxide",
402+ "miniz_oxide 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
393]
403]
394
404
395[[package]]
405[[package]]
396name = "float-cmp"
406name = "float-cmp"
397−version = "0.9.0"
407+version = "0.8.0"
398source = "registry+https://github.com/rust-lang/crates.io-index"
408source = "registry+https://github.com/rust-lang/crates.io-index"
399−checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4"
400dependencies = [
409dependencies = [
401− "num-traits",
410+ "num-traits 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)",
402]
411]
403
412
404[[package]]
413[[package]]
405name = "fnv"
414name = "fnv"
406version = "1.0.7"
415version = "1.0.7"
407source = "registry+https://github.com/rust-lang/crates.io-index"
416source = "registry+https://github.com/rust-lang/crates.io-index"
408−checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
409
417
410[[package]]
418[[package]]
411−name = "form_urlencoded"
419+name = "fuchsia-cprng"
412−version = "1.0.1"
413−source = "registry+https://github.com/rust-lang/crates.io-index"
414−checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191"
415−dependencies = [
416− "matches",
417− "percent-encoding",
418−]
419−
420−[[package]]
421−name = "getrandom"
422−version = "0.2.3"
420+version = "0.1.1"
423source = "registry+https://github.com/rust-lang/crates.io-index"
421source = "registry+https://github.com/rust-lang/crates.io-index"
424−checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753"
425−dependencies = [
426− "cfg-if",
427− "libc",
428− "wasi",
429−]
430
422
431[[package]]
423[[package]]
432−name = "git-version"
424+name = "generic-array"
433−version = "0.3.5"
425+version = "0.12.3"
434source = "registry+https://github.com/rust-lang/crates.io-index"
426source = "registry+https://github.com/rust-lang/crates.io-index"
435−checksum = "f6b0decc02f4636b9ccad390dcbe77b722a77efedfa393caf8379a51d5c61899"
436dependencies = [
427dependencies = [
437− "git-version-macro",
428+ "typenum 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)",
438− "proc-macro-hack",
439]
429]
440
430
441[[package]]
431[[package]]
442−name = "git-version-macro"
432+name = "getrandom"
443−version = "0.3.5"
433+version = "0.1.15"
444source = "registry+https://github.com/rust-lang/crates.io-index"
434source = "registry+https://github.com/rust-lang/crates.io-index"
445−checksum = "fe69f1cbdb6e28af2bac214e943b99ce8a0a06b447d15d3e61161b0423139f3f"
446dependencies = [
435dependencies = [
447− "proc-macro-hack",
436+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
448− "proc-macro2",
437+ "libc 0.2.78 (registry+https://github.com/rust-lang/crates.io-index)",
449− "quote",
438+ "wasi 0.9.0+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)",
450− "syn",
451]
439]
452
440
453[[package]]
441[[package]]
454name = "git2"
442name = "git2"
455−version = "0.14.2"
443+version = "0.13.11"
456source = "registry+https://github.com/rust-lang/crates.io-index"
444source = "registry+https://github.com/rust-lang/crates.io-index"
457−checksum = "3826a6e0e2215d7a41c2bfc7c9244123969273f3476b939a226aac0ab56e9e3c"
458dependencies = [
445dependencies = [
459− "bitflags",
446+ "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
460− "libc",
447+ "libc 0.2.78 (registry+https://github.com/rust-lang/crates.io-index)",
461− "libgit2-sys",
448+ "libgit2-sys 0.12.13+1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
462− "log",
449+ "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
463− "url",
450+ "url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
464]
451]
465
452
466[[package]]
453[[package]]
467name = "glob"
454name = "glob"
468version = "0.3.0"
455version = "0.3.0"
469source = "registry+https://github.com/rust-lang/crates.io-index"
456source = "registry+https://github.com/rust-lang/crates.io-index"
470−checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574"
471
457
472[[package]]
458[[package]]
473name = "globset"
459name = "globset"
474−version = "0.4.8"
460+version = "0.4.5"
475−source = "registry+https://github.com/rust-lang/crates.io-index"
476−checksum = "10463d9ff00a2a068db14231982f5132edebad0d7660cd956a1c30292dbcbfbd"
477−dependencies = [
478− "aho-corasick",
479− "bstr",
480− "fnv",
481− "log",
482− "regex",
483−]
484−
485−[[package]]
486−name = "grep-cli"
487−version = "0.1.6"
488source = "registry+https://github.com/rust-lang/crates.io-index"
461source = "registry+https://github.com/rust-lang/crates.io-index"
489−checksum = "2dd110c34bb4460d0de5062413b773e385cbf8a85a63fc535590110a09e79e8a"
490dependencies = [
462dependencies = [
491− "atty",
463+ "aho-corasick 0.7.13 (registry+https://github.com/rust-lang/crates.io-index)",
492− "bstr",
464+ "bstr 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)",
493− "globset",
465+ "fnv 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)",
494− "lazy_static",
466+ "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
495− "log",
467+ "regex 1.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
496− "regex",
497− "same-file",
498− "termcolor",
499− "winapi-util",
500]
468]
501
469
502[[package]]
470[[package]]
503name = "hashbrown"
471name = "hashbrown"
504−version = "0.11.2"
472+version = "0.9.1"
505source = "registry+https://github.com/rust-lang/crates.io-index"
473source = "registry+https://github.com/rust-lang/crates.io-index"
506−checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e"
507
474
508[[package]]
475[[package]]
509name = "hermit-abi"
476name = "hermit-abi"
510−version = "0.1.19"
477+version = "0.1.16"
511source = "registry+https://github.com/rust-lang/crates.io-index"
478source = "registry+https://github.com/rust-lang/crates.io-index"
512−checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"
513dependencies = [
479dependencies = [
514− "libc",
480+ "libc 0.2.78 (registry+https://github.com/rust-lang/crates.io-index)",
515]
481]
516
482
517[[package]]
483[[package]]
518name = "idna"
484name = "idna"
519−version = "0.2.3"
485+version = "0.2.0"
520source = "registry+https://github.com/rust-lang/crates.io-index"
486source = "registry+https://github.com/rust-lang/crates.io-index"
521−checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8"
522dependencies = [
487dependencies = [
523− "matches",
488+ "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
524− "unicode-bidi",
489+ "unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
525− "unicode-normalization",
490+ "unicode-normalization 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)",
526]
491]
527
492
528[[package]]
493[[package]]
529name = "indexmap"
494name = "indexmap"
530−version = "1.7.0"
495+version = "1.6.0"
531−source = "registry+https://github.com/rust-lang/crates.io-index"
532−checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5"
533−dependencies = [
534− "autocfg",
535− "hashbrown",
536−]
537−
538−[[package]]
539−name = "instant"
540−version = "0.1.12"
541source = "registry+https://github.com/rust-lang/crates.io-index"
496source = "registry+https://github.com/rust-lang/crates.io-index"
542−checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c"
543dependencies = [
497dependencies = [
544− "cfg-if",
498+ "autocfg 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
545−]
546−
547−[[package]]
548−name = "itertools"
549−version = "0.10.3"
550−source = "registry+https://github.com/rust-lang/crates.io-index"
499+ "hashbrown 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
551−checksum = "a9a9d19fa1e79b6215ff29b9d6880b706147f16e9b1dbb1e4e5947b5b02bc5e3"
552−dependencies = [
553− "either",
554]
500]
555
501
556[[package]]
502[[package]]
557name = "itoa"
503name = "itoa"
558−version = "0.4.8"
504+version = "0.4.6"
559source = "registry+https://github.com/rust-lang/crates.io-index"
505source = "registry+https://github.com/rust-lang/crates.io-index"
560−checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4"
561−
562−[[package]]
563−name = "itoa"
564−version = "1.0.1"
565−source = "registry+https://github.com/rust-lang/crates.io-index"
566−checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35"
567
506
568[[package]]
507[[package]]
569name = "jobserver"
508name = "jobserver"
570−version = "0.1.24"
509+version = "0.1.21"
571source = "registry+https://github.com/rust-lang/crates.io-index"
510source = "registry+https://github.com/rust-lang/crates.io-index"
572−checksum = "af25a77299a7f711a01975c35a6a424eb6862092cc2d6c72c4ed6cbc56dfc1fa"
573dependencies = [
511dependencies = [
574− "libc",
512+ "libc 0.2.78 (registry+https://github.com/rust-lang/crates.io-index)",
575]
513]
576
514
577[[package]]
515[[package]]
578name = "lazy_static"
516name = "lazy_static"
579version = "1.4.0"
517version = "1.4.0"
580source = "registry+https://github.com/rust-lang/crates.io-index"
518source = "registry+https://github.com/rust-lang/crates.io-index"
581−checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
519+
520+[[package]]
521+name = "lazycell"
522+version = "1.3.0"
523+source = "registry+https://github.com/rust-lang/crates.io-index"
582
524
583[[package]]
525[[package]]
584name = "libc"
526name = "libc"
585−version = "0.2.125"
527+version = "0.2.78"
586source = "registry+https://github.com/rust-lang/crates.io-index"
528source = "registry+https://github.com/rust-lang/crates.io-index"
587−checksum = "5916d2ae698f6de9bfb891ad7a8d65c09d232dc58cc4ac433c7da3b2fd84bc2b"
588
529
589[[package]]
530[[package]]
590name = "libgit2-sys"
531name = "libgit2-sys"
591−version = "0.13.2+1.4.2"
532+version = "0.12.13+1.0.1"
592source = "registry+https://github.com/rust-lang/crates.io-index"
533source = "registry+https://github.com/rust-lang/crates.io-index"
593−checksum = "3a42de9a51a5c12e00fc0e4ca6bc2ea43582fc6418488e8f615e905d886f258b"
594dependencies = [
534dependencies = [
595− "cc",
535+ "cc 1.0.60 (registry+https://github.com/rust-lang/crates.io-index)",
596− "libc",
536+ "libc 0.2.78 (registry+https://github.com/rust-lang/crates.io-index)",
597− "libz-sys",
537+ "libz-sys 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
598− "pkg-config",
538+ "pkg-config 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)",
599]
539]
600
540
601[[package]]
541[[package]]
602name = "libz-sys"
542name = "libz-sys"
603−version = "1.1.3"
543+version = "1.1.2"
604source = "registry+https://github.com/rust-lang/crates.io-index"
544source = "registry+https://github.com/rust-lang/crates.io-index"
605−checksum = "de5435b8549c16d423ed0c03dbaafe57cf6c3344744f1242520d59c9d8ecec66"
606dependencies = [
545dependencies = [
607− "cc",
546+ "cc 1.0.60 (registry+https://github.com/rust-lang/crates.io-index)",
608− "libc",
547+ "libc 0.2.78 (registry+https://github.com/rust-lang/crates.io-index)",
609− "pkg-config",
548+ "pkg-config 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)",
610− "vcpkg",
549+ "vcpkg 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
611]
550]
612
551
613[[package]]
552[[package]]
614name = "line-wrap"
553name = "line-wrap"
615version = "0.1.1"
554version = "0.1.1"
616source = "registry+https://github.com/rust-lang/crates.io-index"
555source = "registry+https://github.com/rust-lang/crates.io-index"
617−checksum = "f30344350a2a51da54c1d53be93fade8a237e545dbcc4bdbe635413f2117cab9"
618dependencies = [
556dependencies = [
619− "safemem",
557+ "safemem 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
620]
558]
621
559
622[[package]]
560[[package]]
623name = "linked-hash-map"
561name = "linked-hash-map"
624−version = "0.5.4"
562+version = "0.5.3"
625source = "registry+https://github.com/rust-lang/crates.io-index"
563source = "registry+https://github.com/rust-lang/crates.io-index"
626−checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3"
627
564
628[[package]]
565[[package]]
629−name = "lock_api"
566+name = "log"
630−version = "0.4.5"
567+version = "0.4.11"
631source = "registry+https://github.com/rust-lang/crates.io-index"
568source = "registry+https://github.com/rust-lang/crates.io-index"
632−checksum = "712a4d093c9976e24e7dbca41db895dabcbac38eb5f4045393d17a95bdfb1109"
633dependencies = [
569dependencies = [
634− "scopeguard",
570+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
635]
571]
636
572
637[[package]]
573[[package]]
638−name = "log"
574+name = "maplit"
639−version = "0.4.14"
575+version = "1.0.2"
640source = "registry+https://github.com/rust-lang/crates.io-index"
576source = "registry+https://github.com/rust-lang/crates.io-index"
641−checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710"
642−dependencies = [
643− "cfg-if",
644−]
645
577
646[[package]]
578[[package]]
647name = "matches"
579name = "matches"
648−version = "0.1.9"
580+version = "0.1.8"
649source = "registry+https://github.com/rust-lang/crates.io-index"
581source = "registry+https://github.com/rust-lang/crates.io-index"
650−checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f"
651
582
652[[package]]
583[[package]]
653name = "memchr"
584name = "memchr"
654−version = "2.4.1"
585+version = "2.3.3"
655source = "registry+https://github.com/rust-lang/crates.io-index"
586source = "registry+https://github.com/rust-lang/crates.io-index"
656−checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a"
657
587
658[[package]]
588[[package]]
659name = "miniz_oxide"
589name = "miniz_oxide"
660−version = "0.5.1"
590+version = "0.4.2"
661source = "registry+https://github.com/rust-lang/crates.io-index"
591source = "registry+https://github.com/rust-lang/crates.io-index"
662−checksum = "d2b29bd4bc3f33391105ebee3589c19197c4271e3e5a9ec9bfe8127eeff8f082"
663dependencies = [
592dependencies = [
664− "adler",
665−]
666−
667−[[package]]
668−name = "nix"
669−version = "0.24.1"
670−source = "registry+https://github.com/rust-lang/crates.io-index"
593+ "adler 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
671−checksum = "8f17df307904acd05aa8e32e97bb20f2a0df1728bbc2d771ae8f9a90463441e9"
594+ "autocfg 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
672−dependencies = [
673− "bitflags",
674− "cfg-if",
675− "libc",
676]
595]
677
596
678[[package]]
597[[package]]
679name = "normalize-line-endings"
598name = "normalize-line-endings"
680version = "0.3.0"
599version = "0.3.0"
681source = "registry+https://github.com/rust-lang/crates.io-index"
600source = "registry+https://github.com/rust-lang/crates.io-index"
682−checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be"
683
601
684[[package]]
602[[package]]
685−name = "num-traits"
603+name = "num-integer"
686−version = "0.2.14"
604+version = "0.1.43"
687source = "registry+https://github.com/rust-lang/crates.io-index"
605source = "registry+https://github.com/rust-lang/crates.io-index"
688−checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290"
689dependencies = [
606dependencies = [
690− "autocfg",
607+ "autocfg 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
608+ "num-traits 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)",
691]
609]
692
610
693[[package]]
611[[package]]
694−name = "once_cell"
612+name = "num-traits"
695−version = "1.10.0"
613+version = "0.2.12"
696source = "registry+https://github.com/rust-lang/crates.io-index"
614source = "registry+https://github.com/rust-lang/crates.io-index"
697−checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9"
615+dependencies = [
616+ "autocfg 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
617+]
698
618
699[[package]]
619[[package]]
700name = "onig"
620name = "onig"
701−version = "6.3.1"
621+version = "6.1.0"
702source = "registry+https://github.com/rust-lang/crates.io-index"
622source = "registry+https://github.com/rust-lang/crates.io-index"
703−checksum = "67ddfe2c93bb389eea6e6d713306880c7f6dcc99a75b659ce145d962c861b225"
704dependencies = [
623dependencies = [
705− "bitflags",
624+ "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
706− "lazy_static",
625+ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
707− "libc",
626+ "libc 0.2.78 (registry+https://github.com/rust-lang/crates.io-index)",
708− "onig_sys",
627+ "onig_sys 69.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
709]
628]
710
629
711[[package]]
630[[package]]
712name = "onig_sys"
631name = "onig_sys"
713−version = "69.7.1"
632+version = "69.5.1"
714source = "registry+https://github.com/rust-lang/crates.io-index"
633source = "registry+https://github.com/rust-lang/crates.io-index"
715−checksum = "5dd3eee045c84695b53b20255bb7317063df090b68e18bfac0abb6c39cf7f33e"
716dependencies = [
634dependencies = [
717− "cc",
635+ "cc 1.0.60 (registry+https://github.com/rust-lang/crates.io-index)",
718− "pkg-config",
636+ "pkg-config 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)",
719]
637]
720
638
721[[package]]
639[[package]]
722−name = "parking_lot"
640+name = "opaque-debug"
723−version = "0.11.2"
641+version = "0.2.3"
642+source = "registry+https://github.com/rust-lang/crates.io-index"
643+
644+[[package]]
645+name = "path_abs"
646+version = "0.5.0"
724source = "registry+https://github.com/rust-lang/crates.io-index"
647source = "registry+https://github.com/rust-lang/crates.io-index"
725−checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99"
726dependencies = [
648dependencies = [
727− "instant",
649+ "std_prelude 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)",
728− "lock_api",
729− "parking_lot_core",
730]
650]
731
651
732[[package]]
652[[package]]
733−name = "parking_lot_core"
653+name = "percent-encoding"
734−version = "0.8.5"
654+version = "2.1.0"
655+source = "registry+https://github.com/rust-lang/crates.io-index"
656+
657+[[package]]
658+name = "pest"
659+version = "2.1.3"
735source = "registry+https://github.com/rust-lang/crates.io-index"
660source = "registry+https://github.com/rust-lang/crates.io-index"
736−checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216"
737dependencies = [
661dependencies = [
738− "cfg-if",
662+ "ucd-trie 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
739− "instant",
740− "libc",
741− "redox_syscall",
742− "smallvec",
743− "winapi",
744]
663]
745
664
746[[package]]
665[[package]]
747−name = "path_abs"
666+name = "pest_derive"
748−version = "0.5.1"
667+version = "2.1.0"
749source = "registry+https://github.com/rust-lang/crates.io-index"
668source = "registry+https://github.com/rust-lang/crates.io-index"
750−checksum = "05ef02f6342ac01d8a93b65f96db53fe68a92a15f41144f97fb00a9e669633c3"
751dependencies = [
669dependencies = [
752− "std_prelude",
670+ "pest 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
671+ "pest_generator 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
753]
672]
754
673
755[[package]]
674[[package]]
756−name = "percent-encoding"
675+name = "pest_generator"
757−version = "2.1.0"
676+version = "2.1.3"
758source = "registry+https://github.com/rust-lang/crates.io-index"
677source = "registry+https://github.com/rust-lang/crates.io-index"
759−checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e"
678+dependencies = [
679+ "pest 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
680+ "pest_meta 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
681+ "proc-macro2 1.0.24 (registry+https://github.com/rust-lang/crates.io-index)",
682+ "quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)",
683+ "syn 1.0.42 (registry+https://github.com/rust-lang/crates.io-index)",
684+]
685+
686+[[package]]
687+name = "pest_meta"
688+version = "2.1.3"
689+source = "registry+https://github.com/rust-lang/crates.io-index"
690+dependencies = [
691+ "maplit 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
692+ "pest 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
693+ "sha-1 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)",
694+]
760
695
761[[package]]
696[[package]]
762name = "pkg-config"
697name = "pkg-config"
763−version = "0.3.24"
698+version = "0.3.18"
764source = "registry+https://github.com/rust-lang/crates.io-index"
699source = "registry+https://github.com/rust-lang/crates.io-index"
765−checksum = "58893f751c9b0412871a09abd62ecd2a00298c6c83befa223ef98c52aef40cbe"
766
700
767[[package]]
701[[package]]
768name = "plist"
702name = "plist"
769−version = "1.3.1"
703+version = "1.0.0"
770source = "registry+https://github.com/rust-lang/crates.io-index"
704source = "registry+https://github.com/rust-lang/crates.io-index"
771−checksum = "bd39bc6cdc9355ad1dc5eeedefee696bb35c34caf21768741e81826c0bbd7225"
772dependencies = [
705dependencies = [
773− "base64",
706+ "base64 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)",
774− "indexmap",
707+ "chrono 0.4.19 (registry+https://github.com/rust-lang/crates.io-index)",
775− "line-wrap",
708+ "indexmap 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
776− "serde",
709+ "line-wrap 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
777− "time",
710+ "serde 1.0.116 (registry+https://github.com/rust-lang/crates.io-index)",
778− "xml-rs",
711+ "xml-rs 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)",
779]
712]
780
713
781[[package]]
714[[package]]
782name = "predicates"
715name = "predicates"
783−version = "2.1.1"
716+version = "1.0.5"
784source = "registry+https://github.com/rust-lang/crates.io-index"
717source = "registry+https://github.com/rust-lang/crates.io-index"
785−checksum = "a5aab5be6e4732b473071984b3164dbbfb7a3674d30ea5ff44410b6bcd960c3c"
786dependencies = [
718dependencies = [
787− "difflib",
719+ "difference 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
788− "float-cmp",
720+ "float-cmp 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
789− "itertools",
790− "normalize-line-endings",
721+ "normalize-line-endings 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
791− "predicates-core",
722+ "predicates-core 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
792− "regex",
723+ "regex 1.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
793]
724]
794
725
795[[package]]
726[[package]]
796name = "predicates-core"
727name = "predicates-core"
797−version = "1.0.2"
728+version = "1.0.0"
798source = "registry+https://github.com/rust-lang/crates.io-index"
729source = "registry+https://github.com/rust-lang/crates.io-index"
799−checksum = "57e35a3326b75e49aa85f5dc6ec15b41108cf5aee58eabb1f274dd18b73c2451"
800
730
801[[package]]
731[[package]]
802name = "predicates-tree"
732name = "predicates-tree"
803−version = "1.0.4"
733+version = "1.0.0"
804source = "registry+https://github.com/rust-lang/crates.io-index"
734source = "registry+https://github.com/rust-lang/crates.io-index"
805−checksum = "338c7be2905b732ae3984a2f40032b5e94fd8f52505b186c7d4d68d193445df7"
806dependencies = [
735dependencies = [
807− "predicates-core",
736+ "predicates-core 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
808− "termtree",
737+ "treeline 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
809]
738]
810
739
811[[package]]
740[[package]]
812−name = "proc-macro-error"
741+name = "proc-macro2"
813−version = "1.0.4"
742+version = "1.0.24"
814source = "registry+https://github.com/rust-lang/crates.io-index"
743source = "registry+https://github.com/rust-lang/crates.io-index"
815−checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"
816dependencies = [
744dependencies = [
817− "proc-macro-error-attr",
745+ "unicode-xid 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
818− "proc-macro2",
819− "quote",
820− "syn",
821− "version_check",
822]
746]
823
747
824[[package]]
748[[package]]
825−name = "proc-macro-error-attr"
749+name = "quote"
826−version = "1.0.4"
750+version = "1.0.7"
827source = "registry+https://github.com/rust-lang/crates.io-index"
751source = "registry+https://github.com/rust-lang/crates.io-index"
828−checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
829dependencies = [
752dependencies = [
830− "proc-macro2",
753+ "proc-macro2 1.0.24 (registry+https://github.com/rust-lang/crates.io-index)",
831− "quote",
832− "version_check",
833]
754]
834
755
835[[package]]
756[[package]]
836−name = "proc-macro-hack"
757+name = "rand"
837−version = "0.5.19"
758+version = "0.4.6"
838source = "registry+https://github.com/rust-lang/crates.io-index"
759source = "registry+https://github.com/rust-lang/crates.io-index"
839−checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5"
760+dependencies = [
761+ "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
762+ "libc 0.2.78 (registry+https://github.com/rust-lang/crates.io-index)",
763+ "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
764+ "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
765+ "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
766+]
840
767
841[[package]]
768[[package]]
842−name = "proc-macro2"
769+name = "rand_core"
843−version = "1.0.36"
770+version = "0.3.1"
844source = "registry+https://github.com/rust-lang/crates.io-index"
771source = "registry+https://github.com/rust-lang/crates.io-index"
845−checksum = "c7342d5883fbccae1cc37a2353b09c87c9b0f3afd73f5fb9bba687a1f733b029"
846dependencies = [
772dependencies = [
847− "unicode-xid",
773+ "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
848]
774]
849
775
850[[package]]
776[[package]]
851−name = "quote"
777+name = "rand_core"
852−version = "1.0.14"
778+version = "0.4.2"
779+source = "registry+https://github.com/rust-lang/crates.io-index"
780+
781+[[package]]
782+name = "rdrand"
783+version = "0.4.0"
853source = "registry+https://github.com/rust-lang/crates.io-index"
784source = "registry+https://github.com/rust-lang/crates.io-index"
854−checksum = "47aa80447ce4daf1717500037052af176af5d38cc3e571d9ec1c7353fc10c87d"
855dependencies = [
785dependencies = [
856− "proc-macro2",
786+ "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
857]
787]
858
788
859[[package]]
789[[package]]
860name = "redox_syscall"
790name = "redox_syscall"
861−version = "0.2.10"
791+version = "0.1.57"
862source = "registry+https://github.com/rust-lang/crates.io-index"
792source = "registry+https://github.com/rust-lang/crates.io-index"
863−checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff"
864−dependencies = [
865− "bitflags",
866−]
867
793
868[[package]]
794[[package]]
869name = "redox_users"
795name = "redox_users"
870−version = "0.4.0"
796+version = "0.3.5"
871source = "registry+https://github.com/rust-lang/crates.io-index"
797source = "registry+https://github.com/rust-lang/crates.io-index"
872−checksum = "528532f3d801c87aec9def2add9ca802fe569e44a544afe633765267840abe64"
873dependencies = [
798dependencies = [
874− "getrandom",
799+ "getrandom 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)",
875− "redox_syscall",
800+ "redox_syscall 0.1.57 (registry+https://github.com/rust-lang/crates.io-index)",
801+ "rust-argon2 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)",
876]
802]
877
803
878[[package]]
804[[package]]
879name = "regex"
805name = "regex"
880−version = "1.5.5"
806+version = "1.3.9"
881source = "registry+https://github.com/rust-lang/crates.io-index"
807source = "registry+https://github.com/rust-lang/crates.io-index"
882−checksum = "1a11647b6b25ff05a515cb92c365cec08801e83423a235b51e231e1808747286"
883dependencies = [
808dependencies = [
884− "aho-corasick",
809+ "aho-corasick 0.7.13 (registry+https://github.com/rust-lang/crates.io-index)",
885− "memchr",
810+ "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
886− "regex-syntax",
811+ "regex-syntax 0.6.18 (registry+https://github.com/rust-lang/crates.io-index)",
812+ "thread_local 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
887]
813]
888
814
889−[[package]]
890−name = "regex-automata"
891−version = "0.1.10"
892−source = "registry+https://github.com/rust-lang/crates.io-index"
893−checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
894−
895[[package]]
815[[package]]
896name = "regex-syntax"
816name = "regex-syntax"
897−version = "0.6.25"
817+version = "0.6.18"
898source = "registry+https://github.com/rust-lang/crates.io-index"
818source = "registry+https://github.com/rust-lang/crates.io-index"
899−checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b"
900
819
901[[package]]
820[[package]]
902name = "remove_dir_all"
821name = "remove_dir_all"
903version = "0.5.3"
822version = "0.5.3"
904source = "registry+https://github.com/rust-lang/crates.io-index"
823source = "registry+https://github.com/rust-lang/crates.io-index"
905−checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7"
906dependencies = [
824dependencies = [
907− "winapi",
825+ "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
908]
826]
909
827
910[[package]]
828[[package]]
911−name = "rgb"
829+name = "rust-argon2"
912−version = "0.8.31"
830+version = "0.8.2"
913source = "registry+https://github.com/rust-lang/crates.io-index"
831source = "registry+https://github.com/rust-lang/crates.io-index"
914−checksum = "9a374af9a0e5fdcdd98c1c7b64f05004f9ea2555b6c75f211daa81268a3c50f1"
915dependencies = [
832dependencies = [
916− "bytemuck",
833+ "base64 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)",
834+ "blake2b_simd 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)",
835+ "constant_time_eq 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
836+ "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
917]
837]
918
838
919−[[package]]
920−name = "rustversion"
921−version = "1.0.6"
922−source = "registry+https://github.com/rust-lang/crates.io-index"
923−checksum = "f2cc38e8fa666e2de3c4aba7edeb5ffc5246c1c2ed0e3d17e560aeeba736b23f"
924−
925[[package]]
839[[package]]
926name = "ryu"
840name = "ryu"
927−version = "1.0.9"
841+version = "1.0.5"
928source = "registry+https://github.com/rust-lang/crates.io-index"
842source = "registry+https://github.com/rust-lang/crates.io-index"
929−checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f"
930
843
931[[package]]
844[[package]]
932name = "safemem"
845name = "safemem"
933version = "0.3.3"
846version = "0.3.3"
934source = "registry+https://github.com/rust-lang/crates.io-index"
847source = "registry+https://github.com/rust-lang/crates.io-index"
935−checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072"
936
848
937[[package]]
849[[package]]
938name = "same-file"
850name = "same-file"
939version = "1.0.6"
851version = "1.0.6"
940source = "registry+https://github.com/rust-lang/crates.io-index"
852source = "registry+https://github.com/rust-lang/crates.io-index"
941−checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
942dependencies = [
853dependencies = [
943− "winapi-util",
854+ "winapi-util 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
944]
855]
945
856
946[[package]]
857[[package]]
947−name = "scopeguard"
858+name = "semver"
948−version = "1.1.0"
859+version = "0.11.0"
949source = "registry+https://github.com/rust-lang/crates.io-index"
860source = "registry+https://github.com/rust-lang/crates.io-index"
950−checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
861+dependencies = [
862+ "semver-parser 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
863+]
951
864
952[[package]]
865[[package]]
953−name = "semver"
866+name = "semver-parser"
954−version = "1.0.7"
867+version = "0.10.0"
955source = "registry+https://github.com/rust-lang/crates.io-index"
868source = "registry+https://github.com/rust-lang/crates.io-index"
956−checksum = "d65bd28f48be7196d222d95b9243287f48d27aca604e08497513019ff0502cc4"
869+dependencies = [
870+ "pest 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
871+ "pest_derive 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
872+]
957
873
958[[package]]
874[[package]]
959name = "serde"
875name = "serde"
960−version = "1.0.136"
876+version = "1.0.116"
961source = "registry+https://github.com/rust-lang/crates.io-index"
877source = "registry+https://github.com/rust-lang/crates.io-index"
962−checksum = "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789"
963dependencies = [
878dependencies = [
964− "serde_derive",
879+ "serde_derive 1.0.116 (registry+https://github.com/rust-lang/crates.io-index)",
965]
880]
966
881
967[[package]]
882[[package]]
968name = "serde_derive"
883name = "serde_derive"
969−version = "1.0.136"
884+version = "1.0.116"
970source = "registry+https://github.com/rust-lang/crates.io-index"
885source = "registry+https://github.com/rust-lang/crates.io-index"
971−checksum = "08597e7152fcd306f41838ed3e37be9eaeed2b61c42e2117266a554fab4662f9"
972dependencies = [
886dependencies = [
973− "proc-macro2",
887+ "proc-macro2 1.0.24 (registry+https://github.com/rust-lang/crates.io-index)",
974− "quote",
888+ "quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)",
975− "syn",
889+ "syn 1.0.42 (registry+https://github.com/rust-lang/crates.io-index)",
976]
890]
977
891
978[[package]]
892[[package]]
979name = "serde_json"
893name = "serde_json"
980−version = "1.0.74"
894+version = "1.0.58"
981source = "registry+https://github.com/rust-lang/crates.io-index"
895source = "registry+https://github.com/rust-lang/crates.io-index"
982−checksum = "ee2bb9cd061c5865d345bb02ca49fcef1391741b672b54a0bf7b679badec3142"
983dependencies = [
896dependencies = [
984− "itoa 1.0.1",
897+ "itoa 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
985− "ryu",
898+ "ryu 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
986− "serde",
899+ "serde 1.0.116 (registry+https://github.com/rust-lang/crates.io-index)",
987]
900]
988
901
989[[package]]
902[[package]]
990name = "serde_yaml"
903name = "serde_yaml"
991−version = "0.8.23"
904+version = "0.8.13"
992−source = "registry+https://github.com/rust-lang/crates.io-index"
993−checksum = "a4a521f2940385c165a24ee286aa8599633d162077a54bdcae2a6fd5a7bfa7a0"
994−dependencies = [
995− "indexmap",
996− "ryu",
997− "serde",
998− "yaml-rust",
999−]
1000−
1001−[[package]]
1002−name = "serial_test"
1003−version = "0.6.0"
1004source = "registry+https://github.com/rust-lang/crates.io-index"
905source = "registry+https://github.com/rust-lang/crates.io-index"
1005−checksum = "e5bcc41d18f7a1d50525d080fd3e953be87c4f9f1a974f3c21798ca00d54ec15"
1006dependencies = [
906dependencies = [
1007− "lazy_static",
907+ "dtoa 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
1008− "parking_lot",
908+ "linked-hash-map 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
1009− "serial_test_derive",
909+ "serde 1.0.116 (registry+https://github.com/rust-lang/crates.io-index)",
910+ "yaml-rust 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
1010]
911]
1011
912
1012[[package]]
913[[package]]
1013−name = "serial_test_derive"
914+name = "sha-1"
1014−version = "0.6.0"
915+version = "0.8.2"
1015source = "registry+https://github.com/rust-lang/crates.io-index"
916source = "registry+https://github.com/rust-lang/crates.io-index"
1016−checksum = "2881bccd7d60fb32dfa3d7b3136385312f8ad75e2674aab2852867a09790cae8"
1017dependencies = [
917dependencies = [
1018− "proc-macro-error",
918+ "block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)",
1019− "proc-macro2",
919+ "digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
1020− "quote",
920+ "fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
1021− "rustversion",
921+ "opaque-debug 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
1022− "syn",
1023]
922]
1024
923
1025−[[package]]
1026−name = "shell-escape"
1027−version = "0.1.5"
1028−source = "registry+https://github.com/rust-lang/crates.io-index"
1029−checksum = "45bb67a18fa91266cc7807181f62f9178a6873bfad7dc788c42e6430db40184f"
1030−
1031[[package]]
924[[package]]
1032name = "shell-words"
925name = "shell-words"
1033−version = "1.1.0"
926+version = "1.0.0"
1034−source = "registry+https://github.com/rust-lang/crates.io-index"
1035−checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde"
1036−
1037−[[package]]
1038−name = "smallvec"
1039−version = "1.7.0"
1040source = "registry+https://github.com/rust-lang/crates.io-index"
927source = "registry+https://github.com/rust-lang/crates.io-index"
1041−checksum = "1ecab6c735a6bb4139c0caafd0cc3635748bbb3acf4550e8138122099251f309"
1042
928
1043[[package]]
929[[package]]
1044name = "std_prelude"
930name = "std_prelude"
1045version = "0.2.12"
931version = "0.2.12"
1046source = "registry+https://github.com/rust-lang/crates.io-index"
932source = "registry+https://github.com/rust-lang/crates.io-index"
1047−checksum = "8207e78455ffdf55661170876f88daf85356e4edd54e0a3dbc79586ca1e50cbe"
1048
933
1049[[package]]
934[[package]]
1050name = "strsim"
935name = "strsim"
1051version = "0.8.0"
936version = "0.8.0"
1052source = "registry+https://github.com/rust-lang/crates.io-index"
937source = "registry+https://github.com/rust-lang/crates.io-index"
1053−checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
1054
938
1055[[package]]
939[[package]]
1056name = "syn"
940name = "syn"
1057−version = "1.0.85"
941+version = "1.0.42"
1058source = "registry+https://github.com/rust-lang/crates.io-index"
942source = "registry+https://github.com/rust-lang/crates.io-index"
1059−checksum = "a684ac3dcd8913827e18cd09a68384ee66c1de24157e3c556c9ab16d85695fb7"
1060dependencies = [
943dependencies = [
1061− "proc-macro2",
944+ "proc-macro2 1.0.24 (registry+https://github.com/rust-lang/crates.io-index)",
1062− "quote",
945+ "quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)",
1063− "unicode-xid",
946+ "unicode-xid 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
1064]
947]
1065
948
1066[[package]]
949[[package]]
1067name = "syntect"
950name = "syntect"
1068−version = "5.0.0"
951+version = "4.4.0"
1069−source = "registry+https://github.com/rust-lang/crates.io-index"
1070−checksum = "c6c454c27d9d7d9a84c7803aaa3c50cd088d2906fe3c6e42da3209aa623576a8"
1071−dependencies = [
1072− "bincode",
1073− "bitflags",
1074− "fancy-regex",
1075− "flate2",
1076− "fnv",
1077− "lazy_static",
1078− "once_cell",
1079− "onig",
1080− "plist",
1081− "regex-syntax",
1082− "serde",
1083− "serde_derive",
1084− "serde_json",
1085− "thiserror",
1086− "walkdir",
1087− "yaml-rust",
1088−]
1089−
1090−[[package]]
1091−name = "sys-info"
1092−version = "0.9.1"
1093source = "registry+https://github.com/rust-lang/crates.io-index"
952source = "registry+https://github.com/rust-lang/crates.io-index"
1094−checksum = "0b3a0d0aba8bf96a0e1ddfdc352fc53b3df7f39318c71854910c3c4b024ae52c"
1095dependencies = [
953dependencies = [
1096− "cc",
954+ "bincode 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
1097− "libc",
955+ "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
956+ "fancy-regex 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
957+ "flate2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)",
958+ "fnv 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)",
959+ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
960+ "lazycell 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
961+ "onig 6.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
962+ "plist 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
963+ "regex-syntax 0.6.18 (registry+https://github.com/rust-lang/crates.io-index)",
964+ "serde 1.0.116 (registry+https://github.com/rust-lang/crates.io-index)",
965+ "serde_derive 1.0.116 (registry+https://github.com/rust-lang/crates.io-index)",
966+ "serde_json 1.0.58 (registry+https://github.com/rust-lang/crates.io-index)",
967+ "walkdir 2.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
968+ "yaml-rust 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
1098]
969]
1099
970
1100[[package]]
971[[package]]
1101−name = "tempfile"
972+name = "tempdir"
1102−version = "3.3.0"
973+version = "0.3.7"
1103source = "registry+https://github.com/rust-lang/crates.io-index"
974source = "registry+https://github.com/rust-lang/crates.io-index"
1104−checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4"
1105dependencies = [
975dependencies = [
1106− "cfg-if",
976+ "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
1107− "fastrand",
977+ "remove_dir_all 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
1108− "libc",
1109− "redox_syscall",
1110− "remove_dir_all",
1111− "winapi",
1112]
978]
1113
979
1114[[package]]
980[[package]]
1115name = "term_size"
981name = "term_size"
1116version = "0.3.2"
982version = "0.3.2"
1117source = "registry+https://github.com/rust-lang/crates.io-index"
983source = "registry+https://github.com/rust-lang/crates.io-index"
1118−checksum = "1e4129646ca0ed8f45d09b929036bafad5377103edd06e50bf574b353d2b08d9"
1119dependencies = [
984dependencies = [
1120− "libc",
985+ "libc 0.2.78 (registry+https://github.com/rust-lang/crates.io-index)",
1121− "winapi",
986+ "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
1122]
987]
1123
988
1124[[package]]
989[[package]]
1125−name = "termcolor"
990+name = "terminal_size"
1126−version = "1.1.2"
991+version = "0.1.13"
1127source = "registry+https://github.com/rust-lang/crates.io-index"
992source = "registry+https://github.com/rust-lang/crates.io-index"
1128−checksum = "2dfed899f0eb03f32ee8c6a0aabdb8a7949659e3466561fc0adf54e26d88c5f4"
1129dependencies = [
993dependencies = [
1130− "winapi-util",
994+ "libc 0.2.78 (registry+https://github.com/rust-lang/crates.io-index)",
995+ "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
1131]
996]
1132
997
1133[[package]]
998[[package]]
1134−name = "terminal_size"
999+name = "termios"
1135−version = "0.1.17"
1000+version = "0.3.2"
1136source = "registry+https://github.com/rust-lang/crates.io-index"
1001source = "registry+https://github.com/rust-lang/crates.io-index"
1137−checksum = "633c1a546cee861a1a6d0dc69ebeca693bf4296661ba7852b9d21d159e0506df"
1138dependencies = [
1002dependencies = [
1139− "libc",
1003+ "libc 0.2.78 (registry+https://github.com/rust-lang/crates.io-index)",
1140− "winapi",
1141]
1004]
1142
1005
1143−[[package]]
1144−name = "termtree"
1145−version = "0.2.3"
1146−source = "registry+https://github.com/rust-lang/crates.io-index"
1147−checksum = "13a4ec180a2de59b57434704ccfad967f789b12737738798fa08798cd5824c16"
1148−
1149[[package]]
1006[[package]]
1150name = "textwrap"
1007name = "textwrap"
1151version = "0.11.0"
1008version = "0.11.0"
1152source = "registry+https://github.com/rust-lang/crates.io-index"
1009source = "registry+https://github.com/rust-lang/crates.io-index"
1153−checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
1154dependencies = [
1010dependencies = [
1155− "term_size",
1011+ "term_size 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
1156− "unicode-width",
1012+ "unicode-width 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
1157]
1013]
1158
1014
1159[[package]]
1015[[package]]
1160−name = "thiserror"
1016+name = "thread_local"
1161−version = "1.0.31"
1017+version = "1.0.1"
1162source = "registry+https://github.com/rust-lang/crates.io-index"
1018source = "registry+https://github.com/rust-lang/crates.io-index"
1163−checksum = "bd829fe32373d27f76265620b5309d0340cb8550f523c1dda251d6298069069a"
1164dependencies = [
1019dependencies = [
1165− "thiserror-impl",
1020+ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
1166]
1021]
1167
1022
1168[[package]]
1023[[package]]
1169−name = "thiserror-impl"
1024+name = "tinyvec"
1170−version = "1.0.31"
1025+version = "0.3.4"
1171source = "registry+https://github.com/rust-lang/crates.io-index"
1026source = "registry+https://github.com/rust-lang/crates.io-index"
1172−checksum = "0396bc89e626244658bef819e22d0cc459e795a5ebe878e6ec336d1674a8d79a"
1173−dependencies = [
1174− "proc-macro2",
1175− "quote",
1176− "syn",
1177−]
1178
1027
1179[[package]]
1028[[package]]
1180−name = "time"
1029+name = "treeline"
1181−version = "0.3.5"
1030+version = "0.1.0"
1182source = "registry+https://github.com/rust-lang/crates.io-index"
1031source = "registry+https://github.com/rust-lang/crates.io-index"
1183−checksum = "41effe7cfa8af36f439fac33861b66b049edc6f9a32331e2312660529c1c24ad"
1184−dependencies = [
1185− "itoa 0.4.8",
1186− "libc",
1187−]
1188
1032
1189[[package]]
1033[[package]]
1190−name = "tinyvec"
1034+name = "typenum"
1191−version = "1.5.1"
1035+version = "1.12.0"
1192source = "registry+https://github.com/rust-lang/crates.io-index"
1036source = "registry+https://github.com/rust-lang/crates.io-index"
1193−checksum = "2c1c1d5a42b6245520c249549ec267180beaffcc0615401ac8e31853d4b6d8d2"
1194−dependencies = [
1195− "tinyvec_macros",
1196−]
1197
1037
1198[[package]]
1038[[package]]
1199−name = "tinyvec_macros"
1039+name = "ucd-trie"
1200−version = "0.1.0"
1040+version = "0.1.3"
1201source = "registry+https://github.com/rust-lang/crates.io-index"
1041source = "registry+https://github.com/rust-lang/crates.io-index"
1202−checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c"
1203
1042
1204[[package]]
1043[[package]]
1205name = "unicode-bidi"
1044name = "unicode-bidi"
1206−version = "0.3.7"
1045+version = "0.3.4"
1207source = "registry+https://github.com/rust-lang/crates.io-index"
1046source = "registry+https://github.com/rust-lang/crates.io-index"
1208−checksum = "1a01404663e3db436ed2746d9fefef640d868edae3cceb81c3b8d5732fda678f"
1047+dependencies = [
1048+ "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
1049+]
1209
1050
1210[[package]]
1051[[package]]
1211name = "unicode-normalization"
1052name = "unicode-normalization"
1212−version = "0.1.19"
1053+version = "0.1.13"
1213source = "registry+https://github.com/rust-lang/crates.io-index"
1054source = "registry+https://github.com/rust-lang/crates.io-index"
1214−checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9"
1215dependencies = [
1055dependencies = [
1216− "tinyvec",
1056+ "tinyvec 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
1217]
1057]
1218
1058
1219[[package]]
1059[[package]]
1220name = "unicode-width"
1060name = "unicode-width"
1221−version = "0.1.9"
1061+version = "0.1.8"
1222source = "registry+https://github.com/rust-lang/crates.io-index"
1062source = "registry+https://github.com/rust-lang/crates.io-index"
1223−checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973"
1224
1063
1225[[package]]
1064[[package]]
1226name = "unicode-xid"
1065name = "unicode-xid"
1227−version = "0.2.2"
1066+version = "0.2.1"
1228source = "registry+https://github.com/rust-lang/crates.io-index"
1067source = "registry+https://github.com/rust-lang/crates.io-index"
1229−checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3"
1230
1068
1231[[package]]
1069[[package]]
1232name = "url"
1070name = "url"
1233−version = "2.2.2"
1071+version = "2.1.1"
1234source = "registry+https://github.com/rust-lang/crates.io-index"
1072source = "registry+https://github.com/rust-lang/crates.io-index"
1235−checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c"
1236dependencies = [
1073dependencies = [
1237− "form_urlencoded",
1074+ "idna 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
1238− "idna",
1075+ "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
1239− "matches",
1076+ "percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
1240− "percent-encoding",
1241]
1077]
1242
1078
1243[[package]]
1079[[package]]
1244name = "vcpkg"
1080name = "vcpkg"
1245−version = "0.2.15"
1081+version = "0.2.10"
1246source = "registry+https://github.com/rust-lang/crates.io-index"
1082source = "registry+https://github.com/rust-lang/crates.io-index"
1247−checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
1248
1083
1249[[package]]
1084[[package]]
1250name = "vec_map"
1085name = "vec_map"
1251version = "0.8.2"
1086version = "0.8.2"
1252source = "registry+https://github.com/rust-lang/crates.io-index"
1087source = "registry+https://github.com/rust-lang/crates.io-index"
1253−checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191"
1254
1088
1255[[package]]
1089[[package]]
1256name = "version_check"
1090name = "version_check"
1257−version = "0.9.4"
1091+version = "0.9.2"
1258source = "registry+https://github.com/rust-lang/crates.io-index"
1092source = "registry+https://github.com/rust-lang/crates.io-index"
1259−checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
1260
1093
1261[[package]]
1094[[package]]
1262name = "wait-timeout"
1095name = "wait-timeout"
1263version = "0.2.0"
1096version = "0.2.0"
1264source = "registry+https://github.com/rust-lang/crates.io-index"
1097source = "registry+https://github.com/rust-lang/crates.io-index"
1265−checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6"
1266dependencies = [
1098dependencies = [
1267− "libc",
1099+ "libc 0.2.78 (registry+https://github.com/rust-lang/crates.io-index)",
1268]
1100]
1269
1101
1270[[package]]
1102[[package]]
1271name = "walkdir"
1103name = "walkdir"
1272−version = "2.3.2"
1104+version = "2.3.1"
1273source = "registry+https://github.com/rust-lang/crates.io-index"
1105source = "registry+https://github.com/rust-lang/crates.io-index"
1274−checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56"
1275dependencies = [
1106dependencies = [
1276− "same-file",
1107+ "same-file 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
1277− "winapi",
1108+ "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
1278− "winapi-util",
1109+ "winapi-util 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
1279]
1110]
1280
1111
1281[[package]]
1112[[package]]
1282name = "wasi"
1113name = "wasi"
1283−version = "0.10.2+wasi-snapshot-preview1"
1114+version = "0.9.0+wasi-snapshot-preview1"
1284source = "registry+https://github.com/rust-lang/crates.io-index"
1115source = "registry+https://github.com/rust-lang/crates.io-index"
1285−checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6"
1286
1116
1287[[package]]
1117[[package]]
1288name = "wild"
1118name = "wild"
1289version = "2.0.4"
1119version = "2.0.4"
1290source = "registry+https://github.com/rust-lang/crates.io-index"
1120source = "registry+https://github.com/rust-lang/crates.io-index"
1291−checksum = "035793abb854745033f01a07647a79831eba29ec0be377205f2a25b0aa830020"
1292dependencies = [
1121dependencies = [
1293− "glob",
1122+ "glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
1294]
1123]
1295
1124
1296[[package]]
1125[[package]]
1297name = "winapi"
1126name = "winapi"
1298version = "0.3.9"
1127version = "0.3.9"
1299source = "registry+https://github.com/rust-lang/crates.io-index"
1128source = "registry+https://github.com/rust-lang/crates.io-index"
1300−checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
1301dependencies = [
1129dependencies = [
1302− "winapi-i686-pc-windows-gnu",
1130+ "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
1303− "winapi-x86_64-pc-windows-gnu",
1131+ "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
1304]
1132]
1305
1133
1306[[package]]
1134[[package]]
1307name = "winapi-i686-pc-windows-gnu"
1135name = "winapi-i686-pc-windows-gnu"
1308version = "0.4.0"
1136version = "0.4.0"
1309source = "registry+https://github.com/rust-lang/crates.io-index"
1137source = "registry+https://github.com/rust-lang/crates.io-index"
1310−checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
1311
1138
1312[[package]]
1139[[package]]
1313name = "winapi-util"
1140name = "winapi-util"
1314version = "0.1.5"
1141version = "0.1.5"
1315source = "registry+https://github.com/rust-lang/crates.io-index"
1142source = "registry+https://github.com/rust-lang/crates.io-index"
1316−checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178"
1317dependencies = [
1143dependencies = [
1318− "winapi",
1144+ "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
1319]
1145]
1320
1146
1321[[package]]
1147[[package]]
1322name = "winapi-x86_64-pc-windows-gnu"
1148name = "winapi-x86_64-pc-windows-gnu"
1323version = "0.4.0"
1149version = "0.4.0"
1324source = "registry+https://github.com/rust-lang/crates.io-index"
1150source = "registry+https://github.com/rust-lang/crates.io-index"
1325−checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
1326
1151
1327[[package]]
1152[[package]]
1328name = "xml-rs"
1153name = "xml-rs"
1329−version = "0.8.4"
1154+version = "0.8.3"
1330source = "registry+https://github.com/rust-lang/crates.io-index"
1155source = "registry+https://github.com/rust-lang/crates.io-index"
1331−checksum = "d2d7d3948613f75c98fd9328cfdcc45acc4d360655289d0a7d4ec931392200a3"
1332
1156
1333[[package]]
1157[[package]]
1334name = "yaml-rust"
1158name = "yaml-rust"
1335−version = "0.4.5"
1159+version = "0.4.4"
1336−source = "registry+https://github.com/rust-lang/crates.io-index"
1160+source = "registry+https://github.com/rust-lang/crates.io-index"
1337−checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85"
1161+dependencies = [
1338−dependencies = [
1162+ "linked-hash-map 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
1339− "linked-hash-map",
1163+]
1340−]
1164+
1165+[metadata]
1166+"checksum adler 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ee2a4ec343196209d6594e19543ae87a39f96d5534d7174822a3ad825dd6ed7e"
1167+"checksum aho-corasick 0.7.13 (registry+https://github.com/rust-lang/crates.io-index)" = "043164d8ba5c4c3035fec9bbee8647c0261d788f3474306f93bb65901cae0e86"
1168+"checksum ansi_colours 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1d0f302a81afc6a7f4350c04f0ba7cfab529cc009bca3324b3fb5764e6add8b6"
1169+"checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b"
1170+"checksum ansi_term 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2"
1171+"checksum arrayref 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544"
1172+"checksum arrayvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cff77d8686867eceff3105329d4698d96c2391c176d5d03adc90c7389162b5b8"
1173+"checksum assert_cmd 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c88b9ca26f9c16ec830350d309397e74ee9abdfd8eb1f71cb6ecc71a3fc818da"
1174+"checksum atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
1175+"checksum autocfg 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a"
1176+"checksum base64 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff"
1177+"checksum bincode 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f30d3a39baa26f9651f17b375061f3233dde33424a8b72b0dbe93a68a0bc896d"
1178+"checksum bit-set 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6e11e16035ea35e4e5997b393eacbf6f63983188f7a2ad25bfb13465f5ad59de"
1179+"checksum bit-vec 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5f0dc55f2d8a1a85650ac47858bb001b4c0dd73d79e3c455a842925e68d29cd3"
1180+"checksum bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
1181+"checksum blake2b_simd 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)" = "d8fb2d74254a3a0b5cac33ac9f8ed0e44aa50378d9dbb2e5d83bd21ed1dc2c8a"
1182+"checksum block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b"
1183+"checksum block-padding 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5"
1184+"checksum bstr 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)" = "31accafdb70df7871592c058eca3985b71104e15ac32f64706022c58867da931"
1185+"checksum byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7"
1186+"checksum byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de"
1187+"checksum cc 1.0.60 (registry+https://github.com/rust-lang/crates.io-index)" = "ef611cc68ff783f18535d77ddd080185275713d852c4f5cbb6122c462a7a825c"
1188+"checksum cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
1189+"checksum chrono 0.4.19 (registry+https://github.com/rust-lang/crates.io-index)" = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73"
1190+"checksum clap 2.33.3 (registry+https://github.com/rust-lang/crates.io-index)" = "37e58ac78573c40708d45522f0d80fa2f01cc4f9b4e2bf749807255454312002"
1191+"checksum console 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c0b1aacfaffdbff75be81c15a399b4bedf78aaefe840e8af1d299ac2ade885d2"
1192+"checksum constant_time_eq 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc"
1193+"checksum content_inspector 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b7bda66e858c683005a53a9a60c69a4aca7eeaa45d124526e389f7aec8e62f38"
1194+"checksum crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1"
1195+"checksum crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8"
1196+"checksum difference 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198"
1197+"checksum digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5"
1198+"checksum dirs 3.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "142995ed02755914747cc6ca76fc7e4583cd18578746716d0508ea6ed558b9ff"
1199+"checksum dirs-sys 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "8e93d7f5705de3e49895a2b5e0b8855a1c27f080192ae9c32a6432d50741a57a"
1200+"checksum doc-comment 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10"
1201+"checksum dtoa 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "134951f4028bdadb9b84baf4232681efbf277da25144b9b0ad65df75946c422b"
1202+"checksum encode_unicode 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f"
1203+"checksum encoding 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "6b0d943856b990d12d3b55b359144ff341533e516d94098b1d3fc1ac666d36ec"
1204+"checksum encoding-index-japanese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "04e8b2ff42e9a05335dbf8b5c6f7567e5591d0d916ccef4e0b1710d32a0d0c91"
1205+"checksum encoding-index-korean 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "4dc33fb8e6bcba213fe2f14275f0963fd16f0a02c878e3095ecfdf5bee529d81"
1206+"checksum encoding-index-simpchinese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d87a7194909b9118fc707194baa434a4e3b0fb6a5a757c73c3adb07aa25031f7"
1207+"checksum encoding-index-singlebyte 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "3351d5acffb224af9ca265f435b859c7c01537c0849754d3db3fdf2bfe2ae84a"
1208+"checksum encoding-index-tradchinese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fd0e20d5688ce3cab59eb3ef3a2083a5c77bf496cb798dc6fcdb75f323890c18"
1209+"checksum encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a246d82be1c9d791c5dfde9a2bd045fc3cbba3fa2b11ad558f27d01712f00569"
1210+"checksum error-chain 0.12.4 (registry+https://github.com/rust-lang/crates.io-index)" = "2d2f06b9cac1506ece98fe3231e3cc9c4410ec3d5b1f24ae1c8946f0742cdefc"
1211+"checksum fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed"
1212+"checksum fancy-regex 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ae91abf6555234338687bb47913978d275539235fcb77ba9863b779090b42b14"
1213+"checksum flate2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)" = "da80be589a72651dcda34d8b35bcdc9b7254ad06325611074d9cc0fbb19f60ee"
1214+"checksum float-cmp 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e1267f4ac4f343772758f7b1bdcbe767c218bbab93bb432acbf5162bbf85a6c4"
1215+"checksum fnv 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
1216+"checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba"
1217+"checksum generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c68f0274ae0e023facc3c97b2e00f076be70e254bc851d972503b328db79b2ec"
1218+"checksum getrandom 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "fc587bc0ec293155d5bfa6b9891ec18a1e330c234f896ea47fbada4cadbe47e6"
1219+"checksum git2 0.13.11 (registry+https://github.com/rust-lang/crates.io-index)" = "1e094214efbc7fdbbdee952147e493b00e99a4e52817492277e98967ae918165"
1220+"checksum glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574"
1221+"checksum globset 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "7ad1da430bd7281dde2576f44c84cc3f0f7b475e7202cd503042dff01a8c8120"
1222+"checksum hashbrown 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04"
1223+"checksum hermit-abi 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "4c30f6d0bc6b00693347368a67d41b58f2fb851215ff1da49e90fe2c5c667151"
1224+"checksum idna 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "02e2673c30ee86b5b96a9cb52ad15718aa1f966f5ab9ad54a8b95d5ca33120a9"
1225+"checksum indexmap 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "55e2e4c765aa53a0424761bf9f41aa7a6ac1efa87238f59560640e27fca028f2"
1226+"checksum itoa 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "dc6f3ad7b9d11a0c00842ff8de1b60ee58661048eb8049ed33c73594f359d7e6"
1227+"checksum jobserver 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)" = "5c71313ebb9439f74b00d9d2dcec36440beaf57a6aa0623068441dd7cd81a7f2"
1228+"checksum lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
1229+"checksum lazycell 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55"
1230+"checksum libc 0.2.78 (registry+https://github.com/rust-lang/crates.io-index)" = "aa7087f49d294270db4e1928fc110c976cd4b9e5a16348e0a1df09afa99e6c98"
1231+"checksum libgit2-sys 0.12.13+1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "069eea34f76ec15f2822ccf78fe0cdb8c9016764d0a12865278585a74dbdeae5"
1232+"checksum libz-sys 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "602113192b08db8f38796c4e85c39e960c145965140e918018bcde1952429655"
1233+"checksum line-wrap 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f30344350a2a51da54c1d53be93fade8a237e545dbcc4bdbe635413f2117cab9"
1234+"checksum linked-hash-map 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8dd5a6d5999d9907cda8ed67bbd137d3af8085216c2ac62de5be860bd41f304a"
1235+"checksum log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)" = "4fabed175da42fed1fa0746b0ea71f412aa9d35e76e95e59b192c64b9dc2bf8b"
1236+"checksum maplit 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d"
1237+"checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08"
1238+"checksum memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3728d817d99e5ac407411fa471ff9800a778d88a24685968b36824eaf4bee400"
1239+"checksum miniz_oxide 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c60c0dfe32c10b43a144bad8fc83538c52f58302c92300ea7ec7bf7b38d5a7b9"
1240+"checksum normalize-line-endings 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be"
1241+"checksum num-integer 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)" = "8d59457e662d541ba17869cf51cf177c0b5f0cbf476c66bdc90bf1edac4f875b"
1242+"checksum num-traits 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)" = "ac267bcc07f48ee5f8935ab0d24f316fb722d7a1292e2913f0cc196b29ffd611"
1243+"checksum onig 6.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8a155d13862da85473665694f4c05d77fb96598bdceeaf696433c84ea9567e20"
1244+"checksum onig_sys 69.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9bff06597a6b17855040955cae613af000fc0bfc8ad49ea68b9479a74e59292d"
1245+"checksum opaque-debug 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c"
1246+"checksum path_abs 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "eb6b8e6dede0bf94e9300e669f335ba92d5fc9fc8be7f4b1ca8a05206489388c"
1247+"checksum percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e"
1248+"checksum pest 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "10f4872ae94d7b90ae48754df22fd42ad52ce740b8f370b03da4835417403e53"
1249+"checksum pest_derive 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "833d1ae558dc601e9a60366421196a8d94bc0ac980476d0b67e1d0988d72b2d0"
1250+"checksum pest_generator 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "99b8db626e31e5b81787b9783425769681b347011cc59471e33ea46d2ea0cf55"
1251+"checksum pest_meta 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "54be6e404f5317079812fc8f9f5279de376d8856929e21c184ecf6bbd692a11d"
1252+"checksum pkg-config 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)" = "d36492546b6af1463394d46f0c834346f31548646f6ba10849802c9c9a27ac33"
1253+"checksum plist 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b336d94e8e4ce29bf15bba393164629764744c567e8ad306cc1fdd0119967fd"
1254+"checksum predicates 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "96bfead12e90dccead362d62bb2c90a5f6fc4584963645bc7f71a735e0b0735a"
1255+"checksum predicates-core 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "06075c3a3e92559ff8929e7a280684489ea27fe44805174c3ebd9328dcb37178"
1256+"checksum predicates-tree 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8e63c4859013b38a76eca2414c64911fba30def9e3202ac461a2d22831220124"
1257+"checksum proc-macro2 1.0.24 (registry+https://github.com/rust-lang/crates.io-index)" = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71"
1258+"checksum quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "aa563d17ecb180e500da1cfd2b028310ac758de548efdd203e18f283af693f37"
1259+"checksum rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293"
1260+"checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b"
1261+"checksum rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc"
1262+"checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2"
1263+"checksum redox_syscall 0.1.57 (registry+https://github.com/rust-lang/crates.io-index)" = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce"
1264+"checksum redox_users 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "de0737333e7a9502c789a36d7c7fa6092a49895d4faa31ca5df163857ded2e9d"
1265+"checksum regex 1.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "9c3780fcf44b193bc4d09f36d2a3c87b251da4a046c87795a0d35f4f927ad8e6"
1266+"checksum regex-syntax 0.6.18 (registry+https://github.com/rust-lang/crates.io-index)" = "26412eb97c6b088a6997e05f69403a802a92d520de2f8e63c2b65f9e0f47c4e8"
1267+"checksum remove_dir_all 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7"
1268+"checksum rust-argon2 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9dab61250775933275e84053ac235621dfb739556d5c54a2f2e9313b7cf43a19"
1269+"checksum ryu 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e"
1270+"checksum safemem 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072"
1271+"checksum same-file 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
1272+"checksum semver 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6"
1273+"checksum semver-parser 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0e012c6c5380fb91897ba7b9261a0f565e624e869d42fe1a1d03fa0d68a083d5"
1274+"checksum serde 1.0.116 (registry+https://github.com/rust-lang/crates.io-index)" = "96fe57af81d28386a513cbc6858332abc6117cfdb5999647c6444b8f43a370a5"
1275+"checksum serde_derive 1.0.116 (registry+https://github.com/rust-lang/crates.io-index)" = "f630a6370fd8e457873b4bd2ffdae75408bc291ba72be773772a4c2a065d9ae8"
1276+"checksum serde_json 1.0.58 (registry+https://github.com/rust-lang/crates.io-index)" = "a230ea9107ca2220eea9d46de97eddcb04cd00e92d13dda78e478dd33fa82bd4"
1277+"checksum serde_yaml 0.8.13 (registry+https://github.com/rust-lang/crates.io-index)" = "ae3e2dd40a7cdc18ca80db804b7f461a39bb721160a85c9a1fa30134bf3c02a5"
1278+"checksum sha-1 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f7d94d0bede923b3cea61f3f1ff57ff8cdfd77b400fb8f9998949e0cf04163df"
1279+"checksum shell-words 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b6fa3938c99da4914afedd13bf3d79bcb6c277d1b2c398d23257a304d9e1b074"
1280+"checksum std_prelude 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)" = "8207e78455ffdf55661170876f88daf85356e4edd54e0a3dbc79586ca1e50cbe"
1281+"checksum strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
1282+"checksum syn 1.0.42 (registry+https://github.com/rust-lang/crates.io-index)" = "9c51d92969d209b54a98397e1b91c8ae82d8c87a7bb87df0b29aa2ad81454228"
1283+"checksum syntect 4.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4e3978df05b5850c839a6b352d3c35ce0478944a4be689be826b53cf75363e88"
1284+"checksum tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8"
1285+"checksum term_size 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1e4129646ca0ed8f45d09b929036bafad5377103edd06e50bf574b353d2b08d9"
1286+"checksum terminal_size 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "9a14cd9f8c72704232f0bfc8455c0e861f0ad4eb60cc9ec8a170e231414c1e13"
1287+"checksum termios 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6f0fcee7b24a25675de40d5bb4de6e41b0df07bc9856295e7e2b3a3600c400c2"
1288+"checksum textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
1289+"checksum thread_local 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14"
1290+"checksum tinyvec 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "238ce071d267c5710f9d31451efec16c5ee22de34df17cc05e56cbc92e967117"
1291+"checksum treeline 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a7f741b240f1a48843f9b8e0444fb55fb2a4ff67293b50a9179dfd5ea67f8d41"
1292+"checksum typenum 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33"
1293+"checksum ucd-trie 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c"
1294+"checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5"
1295+"checksum unicode-normalization 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "6fb19cf769fa8c6a80a162df694621ebeb4dafb606470b2b2fce0be40a98a977"
1296+"checksum unicode-width 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3"
1297+"checksum unicode-xid 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564"
1298+"checksum url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "829d4a8476c35c9bf0bbce5a3b23f4106f79728039b726d292bb93bc106787cb"
1299+"checksum vcpkg 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "6454029bf181f092ad1b853286f23e2c507d8e8194d01d92da4a55c274a5508c"
1300+"checksum vec_map 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191"
1301+"checksum version_check 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed"
1302+"checksum wait-timeout 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6"
1303+"checksum walkdir 2.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "777182bc735b6424e1a57516d35ed72cb8019d85c8c9bf536dccb3445c1a2f7d"
1304+"checksum wasi 0.9.0+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)" = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
1305+"checksum wild 2.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "035793abb854745033f01a07647a79831eba29ec0be377205f2a25b0aa830020"
1306+"checksum winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
1307+"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
1308+"checksum winapi-util 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178"
1309+"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
1310+"checksum xml-rs 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b07db065a5cf61a7e4ba64f29e67db906fb1787316516c4e6e5ff0fea1efcd8a"
1311+"checksum yaml-rust 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "39f0c922f1a334134dc2f7a8b67dc5d25f0735263feec974345ff706bcf20b0d"
Cargo.toml+31−46
@@ -1,13 +1,17 @@
1[package]
1[package]
2authors = ["David Peter <mail@david-peter.de>"]
2authors = ["David Peter <mail@david-peter.de>"]
3categories = ["command-line-utilities"]
3categories = ["command-line-utilities"]
4−description = "A cat(1) clone with wings."
4+description="A cat(1) clone with wings."
5homepage = "https://github.com/sharkdp/bat"
5homepage = "https://github.com/sharkdp/bat"
6license = "MIT/Apache-2.0"
6license = "MIT/Apache-2.0"
7name = "bat"
7name = "bat"
8+readme = "README.md"
8repository = "https://github.com/sharkdp/bat"
9repository = "https://github.com/sharkdp/bat"
9−version = "0.21.0"
10+version = "0.16.0"
11+exclude = [
10−exclude = ["assets/syntaxes/*", "assets/themes/*"]
12+ "assets/syntaxes/*",
13+ "assets/themes/*",
14+]
11build = "build.rs"
15build = "build.rs"
12edition = '2018'
16edition = '2018'
13
17
@@ -16,84 +20,65 @@ default = ["application"]
16# Feature required for bat the application. Should be disabled when depending on
20# Feature required for bat the application. Should be disabled when depending on
17# bat as a library.
21# bat as a library.
18application = [
22application = [
19− "bugreport",
20− "build-assets",
21− "git",
22− "minimal-application",
23−]
24−# Mainly for developers that want to iterate quickly
25−# Be aware that the included features might change in the future
26−minimal-application = [
27 "atty",
23 "atty",
28 "clap",
24 "clap",
29− "dirs-next",
25+ "dirs",
26+ "git",
27+ "lazy_static",
30 "paging",
28 "paging",
31− "regex-onig",
32 "wild",
29 "wild",
30+ "regex-onig",
33]
31]
34git = ["git2"] # Support indicating git modifications
32git = ["git2"] # Support indicating git modifications
35−paging = ["shell-words", "grep-cli"] # Support applying a pager on the output
33+paging = ["shell-words"] # Support applying a pager on the output
36−build-assets = ["syntect/yaml-load", "syntect/plist-load", "regex", "walkdir"]
37−
38−# You need to use one of these if you depend on bat as a library:
39regex-onig = ["syntect/regex-onig"] # Use the "oniguruma" regex engine
34regex-onig = ["syntect/regex-onig"] # Use the "oniguruma" regex engine
40regex-fancy = ["syntect/regex-fancy"] # Use the rust-only "fancy-regex" engine
35regex-fancy = ["syntect/regex-fancy"] # Use the rust-only "fancy-regex" engine
41
36
42[dependencies]
37[dependencies]
43atty = { version = "0.2.14", optional = true }
38atty = { version = "0.2.14", optional = true }
44ansi_term = "^0.12.1"
39ansi_term = "^0.12.1"
45−ansi_colours = "^1.1"
40+ansi_colours = "^1.0"
46−bincode = "1.0"
47−console = "0.15.0"
41+console = "0.12.0"
48−flate2 = "1.0"
42+dirs = { version = "3.0", optional = true }
49−once_cell = "1.10"
43+lazy_static = { version = "1.4", optional = true }
50−thiserror = "1.0"
51wild = { version = "2.0", optional = true }
44wild = { version = "2.0", optional = true }
52content_inspector = "0.2.4"
45content_inspector = "0.2.4"
53encoding = "0.2"
46encoding = "0.2"
54−shell-words = { version = "1.1.0", optional = true }
47+shell-words = { version = "1.0.0", optional = true }
55−unicode-width = "0.1.9"
48+unicode-width = "0.1.8"
56globset = "0.4"
49globset = "0.4"
57serde = { version = "1.0", features = ["derive"] }
50serde = { version = "1.0", features = ["derive"] }
58serde_yaml = "0.8"
51serde_yaml = "0.8"
59−semver = "1.0"
52+semver = "0.11"
60path_abs = { version = "0.5", default-features = false }
53path_abs = { version = "0.5", default-features = false }
61−clircle = "0.3"
62−bugreport = { version = "0.5.0", optional = true }
63−dirs-next = { version = "2.0.0", optional = true }
64−grep-cli = { version = "0.1.6", optional = true }
65−regex = { version = "1.5.5", optional = true }
66−walkdir = { version = "2.0", optional = true }
67−bytesize = { version = "1.1.0" }
68
54
69[dependencies.git2]
55[dependencies.git2]
70−version = "0.14"
56+version = "0.13"
71optional = true
57optional = true
72default-features = false
58default-features = false
73
59
74[dependencies.syntect]
60[dependencies.syntect]
75−version = "5.0.0"
61+version = "4.4.0"
76default-features = false
62default-features = false
77−features = ["parsing"]
63+features = ["parsing", "yaml-load", "dump-load", "dump-create"]
78
64
79[dependencies.clap]
65[dependencies.clap]
80−version = "2.34"
66+version = "2.33"
81optional = true
67optional = true
82default-features = false
68default-features = false
83features = ["suggestions", "color", "wrap_help"]
69features = ["suggestions", "color", "wrap_help"]
84
70
85−[dev-dependencies]
71+[dependencies.error-chain]
86−assert_cmd = "2.0.4"
72+version = "0.12"
87−serial_test = "0.6.0"
73+default-features = false
88−predicates = "2.1.1"
89−wait-timeout = "0.2.0"
90−tempfile = "3.3.0"
91
74
92−[target.'cfg(unix)'.dev-dependencies]
75+[dev-dependencies]
93−nix = { version = "0.24.1", default-features = false, features = ["term"] }
76+tempdir = "0.3"
77+assert_cmd = "1.0.1"
78+predicates = "1.0.5"
94
79
95[build-dependencies]
80[build-dependencies]
96−clap = { version = "2.34", optional = true }
81+clap = { version = "2.33", optional = true }
97
82
98[profile.release]
83[profile.release]
99lto = true
84lto = true
LICENSE-MIT+1−1
@@ -1,4 +1,4 @@
1−Copyright (c) 2018-2021 bat-developers (https://github.com/sharkdp/bat).
1+Copyright (c) 2018-2020 bat-developers (https://github.com/sharkdp/bat).
2
2
3Permission is hereby granted, free of charge, to any person obtaining a copy
3Permission is hereby granted, free of charge, to any person obtaining a copy
4of this software and associated documentation files (the "Software"), to deal
4of this software and associated documentation files (the "Software"), to deal
NOTICEdeleted−6
@@ -1,6 +0,0 @@
1−Copyright (c) 2018-2021 bat-developers (https://github.com/sharkdp/bat).
2−
3−bat is made available under the terms of either the MIT License or the Apache
4−License 2.0, at your option.
5−
6−See the LICENSE-APACHE and LICENSE-MIT files for license details.
README.md+50−173
@@ -12,26 +12,9 @@
12 <a href="#installation">Installation</a> •
12 <a href="#installation">Installation</a> •
13 <a href="#customization">Customization</a> •
13 <a href="#customization">Customization</a> •
14 <a href="#project-goals-and-alternatives">Project goals, alternatives</a><br>
14 <a href="#project-goals-and-alternatives">Project goals, alternatives</a><br>
15− [English]
16− [<a href="doc/README-zh.md">中文</a>]
17− [<a href="doc/README-ja.md">日本語</a>]
18− [<a href="doc/README-ko.md">한국어</a>]
19− [<a href="doc/README-ru.md">Русский</a>]
15+ [<a href="https://github.com/chinanf-boy/bat-zh">中文</a>] [<a href="doc/README-ja.md">日本語</a>] [<a href="doc/README-ko.md">한국어</a>] [<a href="doc/README-ru.md">Русский</a>]
20</p>
16</p>
21
17
22−### Sponsors
23−
24−A special *thank you* goes to our biggest <a href="doc/sponsors.md">sponsors</a>:<br>
25−<a href="https://workos.com/?utm_campaign=github_repo&utm_medium=referral&utm_content=bat&utm_source=github">
26− <img src="doc/sponsors/workos-logo-white-bg.svg" width="200" alt="WorkOS">
27− <br>
28− <strong>Your app, enterprise-ready.</strong>
29− <br>
30− <sub>Start selling to enterprise customers with just a few lines of code.</sub>
31− <br>
32− <sup>Add Single Sign-On (and more) in minutes instead of months.</sup>
33−</a>
34−
35### Syntax highlighting
18### Syntax highlighting
36
19
37`bat` supports syntax highlighting for a large number of programming and markup
20`bat` supports syntax highlighting for a large number of programming and markup
@@ -55,14 +38,14 @@ characters:
55
38
56### Automatic paging
39### Automatic paging
57
40
58−By default, `bat` pipes its own output to a pager (e.g. `less`) if the output is too large for one screen.
41+`bat` can pipe its own output to a pager (e.g `less`) if the output is too large for one screen.
59−If you would rather `bat` work like `cat` all the time (never page output), you can set `--paging=never` as an option, either on the command line or in your configuration file.
60−If you intend to alias `cat` to `bat` in your shell configuration, you can use `alias cat='bat --paging=never'` to preserve the default behavior.
61
42
62−#### File concatenation
43+### File concatenation
63
44
64−Even with a pager set, you can still use `bat` to concatenate files :wink:.
45+Oh.. you can also use it to concatenate files :wink:. Whenever
65−Whenever `bat` detects a non-interactive terminal (i.e. when you pipe into another process or into a file), `bat` will act as a drop-in replacement for `cat` and fall back to printing the plain file contents, regardless of the `--pager` option's value.
46+`bat` detects a non-interactive terminal (i.e. when you pipe into another process
47+or into a file), `bat` will act as a drop-in replacement for `cat` and
48+fall back to printing the plain file contents.
66
49
67## How to use
50## How to use
68
51
@@ -111,28 +94,14 @@ bat f - g # output 'f', then stdin, then 'g'.
111
94
112### Integration with other tools
95### Integration with other tools
113
96
114−#### `fzf`
115−
116−You can use `bat` as a previewer for [`fzf`](https://github.com/junegunn/fzf). To do this,
117−use `bat`s `--color=always` option to force colorized output. You can also use `--line-range`
118−option to restrict the load times for long files:
119−
120−```bash
121−fzf --preview 'bat --color=always --style=numbers --line-range=:500 {}'
122−```
123−
124−For more information, see [`fzf`'s `README`](https://github.com/junegunn/fzf#preview-window).
125−
126#### `find` or `fd`
97#### `find` or `fd`
127
98
128You can use the `-exec` option of `find` to preview all search results with `bat`:
99You can use the `-exec` option of `find` to preview all search results with `bat`:
129−
130```bash
100```bash
131find … -exec bat {} +
101find … -exec bat {} +
132```
102```
133
103
134If you happen to use [`fd`](https://github.com/sharkdp/fd), you can use the `-X`/`--exec-batch` option to do the same:
104If you happen to use [`fd`](https://github.com/sharkdp/fd), you can use the `-X`/`--exec-batch` option to do the same:
135−
136```bash
105```bash
137fd … -X bat
106fd … -X bat
138```
107```
@@ -148,11 +117,9 @@ batgrep needle src/
148#### `tail -f`
117#### `tail -f`
149
118
150`bat` can be combined with `tail -f` to continuously monitor a given file with syntax highlighting.
119`bat` can be combined with `tail -f` to continuously monitor a given file with syntax highlighting.
151−
152```bash
120```bash
153tail -f /var/log/pacman.log | bat --paging=never -l log
121tail -f /var/log/pacman.log | bat --paging=never -l log
154```
122```
155−
156Note that we have to switch off paging in order for this to work. We have also specified the syntax
123Note that we have to switch off paging in order for this to work. We have also specified the syntax
157explicitly (`-l log`), as it can not be auto-detected in this case.
124explicitly (`-l log`), as it can not be auto-detected in this case.
158
125
@@ -160,23 +127,11 @@ explicitly (`-l log`), as it can not be auto-detected in this case.
160
127
161You can combine `bat` with `git show` to view an older version of a given file with proper syntax
128You can combine `bat` with `git show` to view an older version of a given file with proper syntax
162highlighting:
129highlighting:
163−
164```bash
130```bash
165git show v0.6.0:src/main.rs | bat -l rs
131git show v0.6.0:src/main.rs | bat -l rs
166```
132```
167
133
168−#### `git diff`
169−
170−You can combine `bat` with `git diff` to view lines around code changes with proper syntax
171−highlighting:
172−```bash
173−batdiff() {
174− git diff --name-only --relative --diff-filter=d | xargs bat --diff
175−}
176−```
177−If you prefer to use this as a separate tool, check out `batdiff` in [`bat-extras`](https://github.com/eth-p/bat-extras).
178−
179−If you are looking for more support for git and diff operations, check out [`delta`](https://github.com/dandavison/delta).
134+Note that syntax highlighting within diffs is currently not supported. If you are looking for this, check out [`delta`](https://github.com/dandavison/delta).
180
135
181#### `xclip`
136#### `xclip`
182
137
@@ -197,7 +152,6 @@ bat main.cpp | xclip
197export MANPAGER="sh -c 'col -bx | bat -l man -p'"
152export MANPAGER="sh -c 'col -bx | bat -l man -p'"
198man 2 select
153man 2 select
199```
154```
200−(replace `bat` with `batcat` if you are on Debian or Ubuntu)
201
155
202It might also be necessary to set `MANROFFOPT="-c"` if you experience
156It might also be necessary to set `MANROFFOPT="-c"` if you experience
203formatting problems.
157formatting problems.
@@ -212,41 +166,26 @@ Also, note that this will [not work](https://github.com/sharkdp/bat/issues/1145)
212
166
213The [`prettybat`](https://github.com/eth-p/bat-extras/blob/master/doc/prettybat.md) script is a wrapper that will format code and print it with `bat`.
167The [`prettybat`](https://github.com/eth-p/bat-extras/blob/master/doc/prettybat.md) script is a wrapper that will format code and print it with `bat`.
214
168
215−#### Highlighting `--help` messages
216−
217−You can use `bat` to colorize help text: `$ cp --help | bat -plhelp`
218−
219−You can also use a wrapper around this:
220−
221−```bash
222−# in your .bashrc/.zshrc/*rc
223−alias bathelp='bat --plain --language=help'
224−help() {
225− "$@" --help 2>&1 | bathelp
226−}
227−```
228−
229−Then you can do `$ help cp` or `$ help git commit`.
230−
231−Please report any issues with the help syntax in [this repository](https://github.com/victor-gp/cmd-help-sublime-syntax).
232−
233
169
234## Installation
170## Installation
235
171
236−[![Packaging status](https://repology.org/badge/vertical-allrepos/bat-cat.svg)](https://repology.org/project/bat-cat/versions)
172+[![Packaging status](https://repology.org/badge/vertical-allrepos/bat.svg)](https://repology.org/project/bat/versions)
237
173
238### On Ubuntu (using `apt`)
174### On Ubuntu (using `apt`)
239*... and other Debian-based Linux distributions.*
175*... and other Debian-based Linux distributions.*
240
176
241−`bat` is available on [Ubuntu since 20.04 ("Focal")](https://packages.ubuntu.com/search?keywords=bat&exact=1) and [Debian since August 2021 (Debian 11 - "Bullseye")](https://packages.debian.org/bullseye/bat).
177+`bat` is making its way through the [Ubuntu](https://packages.ubuntu.com/eoan/bat) and
178+[Debian](https://packages.debian.org/sid/bat) package release process, and is available
179+for Ubuntu as of Eoan 19.10. On Debian `bat` is currently only available on the unstable
180+"Sid" branch.
242
181
243If your Ubuntu/Debian installation is new enough you can simply run:
182If your Ubuntu/Debian installation is new enough you can simply run:
244
183
245```bash
184```bash
246−sudo apt install bat
185+apt install bat
247```
186```
248
187
249−**Important**: If you install `bat` this way, please note that the executable may be installed as `batcat` instead of `bat` (due to [a name
188+If you install `bat` this way, please note that the executable may be installed as `batcat` instead of `bat` (due to [a name
250clash with another package](https://github.com/sharkdp/bat/issues/982)). You can set up a `bat -> batcat` symlink or alias to prevent any issues that may come up because of this and to be consistent with other distributions:
189clash with another package](https://github.com/sharkdp/bat/issues/982)). You can set up a `bat -> batcat` symlink or alias to prevent any issues that may come up because of this and to be consistent with other distributions:
251``` bash
190``` bash
252mkdir -p ~/.local/bin
191mkdir -p ~/.local/bin
@@ -261,7 +200,7 @@ the most recent release of `bat`, download the latest `.deb` package from the
261[release page](https://github.com/sharkdp/bat/releases) and install it via:
200[release page](https://github.com/sharkdp/bat/releases) and install it via:
262
201
263```bash
202```bash
264−sudo dpkg -i bat_0.18.3_amd64.deb # adapt version number and architecture
203+sudo dpkg -i bat_0.16.0_amd64.deb # adapt version number and architecture
265```
204```
266
205
267### On Alpine Linux
206### On Alpine Linux
@@ -290,14 +229,6 @@ You can install [the `bat` package](https://koji.fedoraproject.org/koji/packagei
290dnf install bat
229dnf install bat
291```
230```
292
231
293−### On Funtoo Linux
294−
295−You can install [the `bat` package](https://github.com/funtoo/dev-kit/tree/1.4-release/sys-apps/bat) from dev-kit.
296−
297−```bash
298−emerge sys-apps/bat
299−```
300−
301### On Gentoo Linux
232### On Gentoo Linux
302
233
303You can install [the `bat` package](https://packages.gentoo.org/packages/sys-apps/bat)
234You can install [the `bat` package](https://packages.gentoo.org/packages/sys-apps/bat)
@@ -314,13 +245,6 @@ You can install `bat` via xbps-install:
314xbps-install -S bat
245xbps-install -S bat
315```
246```
316
247
317−### On Termux
318−
319−You can install `bat` via pkg:
320−```bash
321−pkg install bat
322−```
323−
324### On FreeBSD
248### On FreeBSD
325
249
326You can install a precompiled [`bat` package](https://www.freshports.org/textproc/bat) with pkg:
250You can install a precompiled [`bat` package](https://www.freshports.org/textproc/bat) with pkg:
@@ -336,14 +260,6 @@ cd /usr/ports/textproc/bat
336make install
260make install
337```
261```
338
262
339−### On OpenBSD
340−
341−You can install `bat` package using [`pkg_add(1)`](https://man.openbsd.org/pkg_add.1):
342−
343−```bash
344−pkg_add bat
345−```
346−
347### Via nix
263### Via nix
348
264
349You can install `bat` using the [nix package manager](https://nixos.org/nix):
265You can install `bat` using the [nix package manager](https://nixos.org/nix):
@@ -360,11 +276,6 @@ You can install `bat` with zypper:
360zypper install bat
276zypper install bat
361```
277```
362
278
363−### Via snap package
364−
365−There is currently no recommended snap package available.
366−Existing packages may be available, but are not officially supported and may contain [issues](https://github.com/sharkdp/bat/issues/1519).
367−
368### On macOS (or Linux) via Homebrew
279### On macOS (or Linux) via Homebrew
369
280
370You can install `bat` with [Homebrew on MacOS](https://formulae.brew.sh/formula/bat) or [Homebrew on Linux](https://formulae.brew.sh/formula-linux/bat):
281You can install `bat` with [Homebrew on MacOS](https://formulae.brew.sh/formula/bat) or [Homebrew on Linux](https://formulae.brew.sh/formula-linux/bat):
@@ -418,14 +329,14 @@ binaries are also available: look for archives with `musl` in the file name.
418
329
419### From source
330### From source
420
331
421−If you want to build `bat` from source, you need Rust 1.51 or
332+If you want to build `bat` from source, you need Rust 1.40 or
422higher. You can then use `cargo` to build everything:
333higher. You can then use `cargo` to build everything:
423
334
424```bash
335```bash
425cargo install --locked bat
336cargo install --locked bat
426```
337```
427
338
428−Note that additional files like the man page or shell completion
339+Note that addition files like the man page or shell completion
429files can not be installed in this way. They will be generated by `cargo` and should be available in the cargo target folder (under `build`).
340files can not be installed in this way. They will be generated by `cargo` and should be available in the cargo target folder (under `build`).
430
341
431## Customization
342## Customization
@@ -452,11 +363,12 @@ You can also use a custom theme by following the
452
363
453### 8-bit themes
364### 8-bit themes
454
365
455−`bat` has three themes that always use [8-bit colors](https://en.wikipedia.org/wiki/ANSI_escape_code#Colors),
366+`bat` has four themes that always use [8-bit colors](https://en.wikipedia.org/wiki/ANSI_escape_code#Colors),
456even when truecolor support is available:
367even when truecolor support is available:
457
368
458−- `ansi` looks decent on any terminal. It uses 3-bit colors: black, red, green,
369+- `ansi-dark` looks decent on any terminal with a dark background. It uses 3-bit colors: black, red,
459− yellow, blue, magenta, cyan, and white.
370+ green, yellow, blue, magenta, cyan, and white.
371+- `ansi-light` is like `ansi-dark`, but for terminals with a light background.
460- `base16` is designed for [base16](https://github.com/chriskempson/base16) terminal themes. It uses
372- `base16` is designed for [base16](https://github.com/chriskempson/base16) terminal themes. It uses
461 4-bit colors (3-bit colors plus bright variants) in accordance with the
373 4-bit colors (3-bit colors plus bright variants) in accordance with the
462 [base16 styling guidelines](https://github.com/chriskempson/base16/blob/master/styling.md).
374 [base16 styling guidelines](https://github.com/chriskempson/base16/blob/master/styling.md).
@@ -464,11 +376,10 @@ even when truecolor support is available:
464 It replaces certain bright colors with 8-bit colors from 16 to 21. **Do not** use this simply
376 It replaces certain bright colors with 8-bit colors from 16 to 21. **Do not** use this simply
465 because you have a 256-color terminal but are not using base16-shell.
377 because you have a 256-color terminal but are not using base16-shell.
466
378
467−Although these themes are more restricted, they have three advantages over truecolor themes. They:
379+Although these themes are more restricted, they have two advantages over truecolor themes:
468
380
469−- Enjoy maximum compatibility. Some terminal utilities do not support more than 3-bit colors.
470−- Adapt to terminal theme changes. Even for already printed output.
471−- Visually harmonize better with other terminal software.
381+- They harmonize better with other terminal software using 3-bit or 4-bit colors.
382+- When you change your terminal theme, `bat` output already on the screen will update to match.
472
383
473### Output style
384### Output style
474
385
@@ -480,45 +391,35 @@ variable to make these changes permanent or use `bat`s
480
391
481### Adding new syntaxes / language definitions
392### Adding new syntaxes / language definitions
482
393
483−Should you find that a particular syntax is not available within `bat`, you can follow these
484−instructions to easily add new syntaxes to your current `bat` installation.
485−
486`bat` uses the excellent [`syntect`](https://github.com/trishume/syntect/)
394`bat` uses the excellent [`syntect`](https://github.com/trishume/syntect/)
487library for syntax highlighting. `syntect` can read any
395library for syntax highlighting. `syntect` can read any
488[Sublime Text `.sublime-syntax` file](https://www.sublimetext.com/docs/3/syntax.html)
396[Sublime Text `.sublime-syntax` file](https://www.sublimetext.com/docs/3/syntax.html)
489−and theme.
397+and theme. To add new syntax definitions, do the following.
490−
491−A good resource for finding Sublime Syntax packages is [Package Control](https://packagecontrol.io/). Once you found a
492−syntax:
493
398
494−1. Create a folder with syntax definition files:
399+Create a folder with syntax definition files:
495
400
496− ```bash
401+```bash
497− mkdir -p "$(bat --config-dir)/syntaxes"
402+mkdir -p "$(bat --config-dir)/syntaxes"
498− cd "$(bat --config-dir)/syntaxes"
403+cd "$(bat --config-dir)/syntaxes"
499−
500− # Put new '.sublime-syntax' language definition files
501− # in this folder (or its subdirectories), for example:
502− git clone https://github.com/tellnobody1/sublime-purescript-syntax
503− ```
504
404
505−2. Now use the following command to parse these files into a binary cache:
405+# Put new '.sublime-syntax' language definition files
406+# in this folder (or its subdirectories), for example:
407+git clone https://github.com/tellnobody1/sublime-purescript-syntax
408+```
506
409
507− ```bash
410+Now use the following command to parse these files into a binary cache:
508− bat cache --build
509− ```
510
411
511−3. Finally, use `bat --list-languages` to check if the new languages are available.
412+```bash
413+bat cache --build
414+```
512
415
513− If you ever want to go back to the default settings, call:
416+Finally, use `bat --list-languages` to check if the new languages are available.
514
417
515− ```bash
418+If you ever want to go back to the default settings, call:
516− bat cache --clear
517− ```
518
419
519−4. If you think that a specific syntax should be included in `bat` by default, please
420+```bash
520− consider opening a "syntax request" ticket after reading the policies and
421+bat cache --clear
521− instructions [here](doc/assets.md): [Open Syntax Request](https://github.com/sharkdp/bat/issues/new?labels=syntax-request&template=syntax_request.md).
422+```
522
423
523### Adding new themes
424### Adding new themes
524
425
@@ -544,11 +445,10 @@ You can add new (or change existing) file name patterns using the `--map-syntax`
544command line option. The option takes an argument of the form `pattern:syntax` where
445command line option. The option takes an argument of the form `pattern:syntax` where
545`pattern` is a glob pattern that is matched against the file name and
446`pattern` is a glob pattern that is matched against the file name and
546the absolute file path. The `syntax` part is the full name of a supported language
447the absolute file path. The `syntax` part is the full name of a supported language
547−(use `bat --list-languages` for an overview).
448+(use `bat --list-languages` for an overview)full .
548
449
549−**Note:** You probably want to use this option as [an entry in `bat`'s configuration file](#configuration-file)
450+Note: You probably want to use this option as an entry in `bat`s configuration file instead
550−for persistence instead of passing it on the command line as a one-off. Generally
451+of passing it on the command line (see below).
551−you'd just use `-l` if you want to manually specify a language for a file.
552
452
553Example: To use "INI" syntax highlighting for all files with a `.conf` file extension, use
453Example: To use "INI" syntax highlighting for all files with a `.conf` file extension, use
554```bash
454```bash
@@ -563,7 +463,7 @@ Example: To open all files called `.ignore` (exact match) with the "Git Ignore"
563Example: To open all `.conf` files in subfolders of `/etc/apache2` with the "Apache Conf"
463Example: To open all `.conf` files in subfolders of `/etc/apache2` with the "Apache Conf"
564syntax, use (this mapping is already built in):
464syntax, use (this mapping is already built in):
565```bash
465```bash
566−--map-syntax='/etc/apache2/**/*.conf:Apache Conf'
466+-map-syntax='/etc/apache2/**/*.conf:Apache Conf'
567```
467```
568
468
569### Using a different pager
469### Using a different pager
@@ -573,8 +473,6 @@ set, `less` is used by default. If you want to use a different pager, you can ei
573`PAGER` variable or set the `BAT_PAGER` environment variable to override what is specified in
473`PAGER` variable or set the `BAT_PAGER` environment variable to override what is specified in
574`PAGER`.
474`PAGER`.
575
475
576−**Note**: If `PAGER` is `more` or `most`, `bat` will silently use `less` instead to ensure support for colors.
577−
578If you want to pass command-line arguments to the pager, you can also set them via the
476If you want to pass command-line arguments to the pager, you can also set them via the
579`PAGER`/`BAT_PAGER` variables:
477`PAGER`/`BAT_PAGER` variables:
580
478
@@ -624,7 +522,7 @@ alias cat="bat --theme=\$(defaults read -globalDomain AppleInterfaceStyle &> /de
624
522
625`bat` can also be customized with a configuration file. The location of the file is dependent
523`bat` can also be customized with a configuration file. The location of the file is dependent
626on your operating system. To get the default path for your system, call
524on your operating system. To get the default path for your system, call
627−```bash
525+```
628bat --config-file
526bat --config-file
629```
527```
630
528
@@ -654,7 +552,7 @@ Example configuration file:
654# Use italic text on the terminal (not supported on all terminals)
552# Use italic text on the terminal (not supported on all terminals)
655--italic-text=always
553--italic-text=always
656
554
657−# Use C++ syntax for Arduino .ino files
555+# Use C++ syntax for .ino files
658--map-syntax "*.ino:C++"
556--map-syntax "*.ino:C++"
659```
557```
660
558
@@ -706,13 +604,6 @@ bat() {
706
604
707## Troubleshooting
605## Troubleshooting
708
606
709−### Garbled output
710−
711−If an input file contains color codes or other ANSI escape sequences or control characters, `bat` will have problems
712−performing syntax highlighting and text wrapping, and thus the output can become garbled.
713−When displaying such files it is recommended to disable both syntax highlighting and wrapping by
714−passing the `--color=never --wrap=never` options to `bat`.
715−
716### Terminals & colors
607### Terminals & colors
717
608
718`bat` handles terminals *with* and *without* truecolor support. However, the colors in most syntax
609`bat` handles terminals *with* and *without* truecolor support. However, the colors in most syntax
@@ -764,25 +655,11 @@ bash assets/create.sh
764cargo install --path . --locked --force
655cargo install --path . --locked --force
765```
656```
766
657
767−If you want to build an application that uses `bat`s pretty-printing
768−features as a library, check out the [the API documentation](https://docs.rs/bat/).
769−Note that you have to use either `regex-onig` or `regex-fancy` as a feature
770−when you depend on `bat` as a library.
771−
772−## Contributing
773−
774−Take a look at the [`CONTRIBUTING.md`](CONTRIBUTING.md) guide.
775−
776## Maintainers
658## Maintainers
777
659
778- [sharkdp](https://github.com/sharkdp)
660- [sharkdp](https://github.com/sharkdp)
779- [eth-p](https://github.com/eth-p)
661- [eth-p](https://github.com/eth-p)
780- [keith-hall](https://github.com/keith-hall)
662- [keith-hall](https://github.com/keith-hall)
781−- [Enselic](https://github.com/Enselic)
782−
783−## Security vulnerabilities
784−
785−Please contact [David Peter](https://david-peter.de/) via email if you want to report a vulnerability in `bat`.
786
663
787## Project goals and alternatives
664## Project goals and alternatives
788
665
@@ -797,7 +674,7 @@ There are a lot of alternatives, if you are looking for similar programs. See
797[this document](doc/alternatives.md) for a comparison.
674[this document](doc/alternatives.md) for a comparison.
798
675
799## License
676## License
800−Copyright (c) 2018-2021 [bat-developers](https://github.com/sharkdp/bat).
677+Copyright (c) 2018-2020 [bat-developers](https://github.com/sharkdp/bat).
801
678
802`bat` is made available under the terms of either the MIT License or the Apache License 2.0, at your option.
679`bat` is made available under the terms of either the MIT License or the Apache License 2.0, at your option.
803
680
assets/README.mdnew file+52
@@ -0,0 +1,52 @@
1+## Syntax Highlighting in bat
2+
3+`bat` uses the [syntect](https://github.com/trishume/syntect) library to highlight source
4+code. As a basis, syntect uses [Sublime Text](https://www.sublimetext.com/) syntax definitions
5+in the `.sublime-syntax` format.
6+
7+In order to add new syntaxes to `bat`, follow these steps:
8+
9+1. Find a Sublime Text syntax for the given language, preferably in a separate Git repository
10+ which can be included as a submodule (under `assets/syntaxes`).
11+
12+2. If the Sublime Text syntax is only available as a `.tmLanguage` file, open the file in
13+ Sublime Text and convert it to a `.sublime-syntax` file via *Tools* -> *Developer* ->
14+ *New Syntax from XXX.tmLanguage...*. Save the new file in the `assets/syntaxes` folder.
15+
16+3. Run the `create.sh` script. It calls `bat cache --build` to parse all available
17+ `.sublime-syntax` files and serialize them to a `syntaxes.bin` file (in this folder).
18+
19+4. Re-compile `bat`. At compilation time, the `syntaxes.bin` file will be stored inside the
20+ `bat` binary.
21+
22+5. If you send a pull request with your changes, please do *not* include the changed `syntaxes.bin`
23+ file. A new binary cache file will be created once before every new release of `bat`.
24+
25+### Troubleshooting
26+
27+Make sure that the local cache does not interfere with the internally stored syntaxes and
28+themes (`bat cache --clear`).
29+
30+### Manual modifications
31+
32+The following files have been manually modified after converting from a `.tmLanguage` file:
33+
34+* `Apache.sublime_syntax`=> removed `.conf` and `.CONF` file types.
35+* `Dart.sublime-syntax` => removed `#regex.dart` include.
36+* `INI.sublime-syntax` => added `.hgrc`, `hgrc`, and `desktop` file types and support for comments after section headers
37+* `Org mode.sublime-syntax` => removed `task` file type.
38+* `SML.sublime_syntax` => removed `ml` file type.
39+
40+### Non-submodule additions
41+
42+* `Assembly (x86_64)` has been manually added from https://github.com/13xforever/x86-assembly-textmate-bundle due to `git clone` recursion problems
43+* `Nim.sublime-syntax` has been added manually from https://github.com/getzola/zola/blob/master/sublime_syntaxes/Nim.sublime-syntax as there was no suitable Git repository for it. The original syntax seems to originate from https://github.com/Varriount/NimLime
44+* `Rego.sublime-syntax` has been added manually from https://github.com/open-policy-agent/opa/blob/master/misc/syntax/sublime/rego.sublime-syntax
45+ as it is not kept in a standalone repository. The file is generated from
46+ https://github.com/open-policy-agent/opa/blob/master/misc/syntax/textmate/Rego.tmLanguage
47+* `SML.sublime_syntax` has been added manually from
48+ https://github.com/seanjames777/SML-Language-Definitiona as it is not
49+ kept in a standalone repository. The file generated is from
50+ https://github.com/seanjames777/SML-Language-Definition/blob/master/sml.tmLanguage
51+* `Cabal.sublime_syntax` has been added manually from
52+ https://github.com/SublimeHaskell/SublimeHaskell/ - we don't want to include the whole submodule because it includes other syntaxes ("Haskell improved") as well.
assets/acknowledgements.bindeleted

Binary file not shown.

assets/completions/_bat.ps1.indeleted−92
@@ -1,92 +0,0 @@
1−
2−using namespace System.Management.Automation
3−using namespace System.Management.Automation.Language
4−
5−Register-ArgumentCompleter -Native -CommandName '{{PROJECT_EXECUTABLE}}' -ScriptBlock {
6− param($wordToComplete, $commandAst, $cursorPosition)
7−
8− $commandElements = $commandAst.CommandElements
9− $command = @(
10− '{{PROJECT_EXECUTABLE}}'
11− for ($i = 1; $i -lt $commandElements.Count; $i++) {
12− $element = $commandElements[$i]
13− if ($element -isnot [StringConstantExpressionAst] -or
14− $element.StringConstantType -ne [StringConstantType]::BareWord -or
15− $element.Value.StartsWith('-')) {
16− break
17− }
18− $element.Value
19− }) -join ';'
20−
21− $completions = @(switch ($command) {
22− '{{PROJECT_EXECUTABLE}}' {
23− [CompletionResult]::new('-l', 'l', [CompletionResultType]::ParameterName, 'Set the language for syntax highlighting.')
24− [CompletionResult]::new('--language', 'language', [CompletionResultType]::ParameterName, 'Set the language for syntax highlighting.')
25− [CompletionResult]::new('-H', 'H', [CompletionResultType]::ParameterName, 'Highlight lines N through M.')
26− [CompletionResult]::new('--highlight-line', 'highlight-line', [CompletionResultType]::ParameterName, 'Highlight lines N through M.')
27− [CompletionResult]::new('--file-name', 'file-name', [CompletionResultType]::ParameterName, 'Specify the name to display for a file.')
28− [CompletionResult]::new('--diff-context', 'diff-context', [CompletionResultType]::ParameterName, 'diff-context')
29− [CompletionResult]::new('--tabs', 'tabs', [CompletionResultType]::ParameterName, 'Set the tab width to T spaces.')
30− [CompletionResult]::new('--wrap', 'wrap', [CompletionResultType]::ParameterName, 'Specify the text-wrapping mode (*auto*, never, character).')
31− [CompletionResult]::new('--terminal-width', 'terminal-width', [CompletionResultType]::ParameterName, 'Explicitly set the width of the terminal instead of determining it automatically. If prefixed with ''+'' or ''-'', the value will be treated as an offset to the actual terminal width. See also: ''--wrap''.')
32− [CompletionResult]::new('--color', 'color', [CompletionResultType]::ParameterName, 'When to use colors (*auto*, never, always).')
33− [CompletionResult]::new('--italic-text', 'italic-text', [CompletionResultType]::ParameterName, 'Use italics in output (always, *never*)')
34− [CompletionResult]::new('--decorations', 'decorations', [CompletionResultType]::ParameterName, 'When to show the decorations (*auto*, never, always).')
35− [CompletionResult]::new('--paging', 'paging', [CompletionResultType]::ParameterName, 'Specify when to use the pager, or use `-P` to disable (*auto*, never, always).')
36− [CompletionResult]::new('--pager', 'pager', [CompletionResultType]::ParameterName, 'Determine which pager to use.')
37− [CompletionResult]::new('-m', 'm', [CompletionResultType]::ParameterName, 'Use the specified syntax for files matching the glob pattern (''*.cpp:C++'').')
38− [CompletionResult]::new('--map-syntax', 'map-syntax', [CompletionResultType]::ParameterName, 'Use the specified syntax for files matching the glob pattern (''*.cpp:C++'').')
39− [CompletionResult]::new('--theme', 'theme', [CompletionResultType]::ParameterName, 'Set the color theme for syntax highlighting.')
40− [CompletionResult]::new('--style', 'style', [CompletionResultType]::ParameterName, 'Comma-separated list of style elements to display (*default*, auto, full, plain, changes, header, header-filename, header-filesize, grid, rule, numbers, snip).')
41− [CompletionResult]::new('-r', 'r', [CompletionResultType]::ParameterName, 'Only print the lines from N to M.')
42− [CompletionResult]::new('--line-range', 'line-range', [CompletionResultType]::ParameterName, 'Only print the lines from N to M.')
43− [CompletionResult]::new('-A', 'A', [CompletionResultType]::ParameterName, 'Show non-printable characters (space, tab, newline, ..).')
44− [CompletionResult]::new('--show-all', 'show-all', [CompletionResultType]::ParameterName, 'Show non-printable characters (space, tab, newline, ..).')
45− [CompletionResult]::new('-p', 'p', [CompletionResultType]::ParameterName, 'Show plain style (alias for ''--style=plain'').')
46− [CompletionResult]::new('--plain', 'plain', [CompletionResultType]::ParameterName, 'Show plain style (alias for ''--style=plain'').')
47− [CompletionResult]::new('-d', 'd', [CompletionResultType]::ParameterName, 'Only show lines that have been added/removed/modified.')
48− [CompletionResult]::new('--diff', 'diff', [CompletionResultType]::ParameterName, 'Only show lines that have been added/removed/modified.')
49− [CompletionResult]::new('-n', 'n', [CompletionResultType]::ParameterName, 'Show line numbers (alias for ''--style=numbers'').')
50− [CompletionResult]::new('--number', 'number', [CompletionResultType]::ParameterName, 'Show line numbers (alias for ''--style=numbers'').')
51− [CompletionResult]::new('-f', 'f', [CompletionResultType]::ParameterName, 'f')
52− [CompletionResult]::new('--force-colorization', 'force-colorization', [CompletionResultType]::ParameterName, 'force-colorization')
53− [CompletionResult]::new('-P', 'P', [CompletionResultType]::ParameterName, 'Alias for ''--paging=never''')
54− [CompletionResult]::new('--no-paging', 'no-paging', [CompletionResultType]::ParameterName, 'Alias for ''--paging=never''')
55− [CompletionResult]::new('--list-themes', 'list-themes', [CompletionResultType]::ParameterName, 'Display all supported highlighting themes.')
56− [CompletionResult]::new('-L', 'L', [CompletionResultType]::ParameterName, 'Display all supported languages.')
57− [CompletionResult]::new('--list-languages', 'list-languages', [CompletionResultType]::ParameterName, 'Display all supported languages.')
58− [CompletionResult]::new('-u', 'u', [CompletionResultType]::ParameterName, 'u')
59− [CompletionResult]::new('--unbuffered', 'unbuffered', [CompletionResultType]::ParameterName, 'unbuffered')
60− [CompletionResult]::new('--no-config', 'no-config', [CompletionResultType]::ParameterName, 'Do not use the configuration file')
61− [CompletionResult]::new('--no-custom-assets', 'no-custom-assets', [CompletionResultType]::ParameterName, 'Do not load custom assets')
62− [CompletionResult]::new('--config-file', 'config-file', [CompletionResultType]::ParameterName, 'Show path to the configuration file.')
63− [CompletionResult]::new('--generate-config-file', 'generate-config-file', [CompletionResultType]::ParameterName, 'Generates a default configuration file.')
64− [CompletionResult]::new('--config-dir', 'config-dir', [CompletionResultType]::ParameterName, 'Show bat''s configuration directory.')
65− [CompletionResult]::new('--cache-dir', 'cache-dir', [CompletionResultType]::ParameterName, 'Show bat''s cache directory.')
66− [CompletionResult]::new('--diagnostic', 'diagnostic', [CompletionResultType]::ParameterName, 'Show diagnostic information for bug reports.')
67− [CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Print this help message.')
68− [CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Print this help message.')
69− [CompletionResult]::new('-V', 'V', [CompletionResultType]::ParameterName, 'Show version information.')
70− [CompletionResult]::new('--version', 'version', [CompletionResultType]::ParameterName, 'Show version information.')
71− [CompletionResult]::new('cache', 'cache', [CompletionResultType]::ParameterValue, 'Modify the syntax-definition and theme cache')
72− break
73− }
74− '{{PROJECT_EXECUTABLE}};cache' {
75− [CompletionResult]::new('--source', 'source', [CompletionResultType]::ParameterName, 'Use a different directory to load syntaxes and themes from.')
76− [CompletionResult]::new('--target', 'target', [CompletionResultType]::ParameterName, 'Use a different directory to store the cached syntax and theme set.')
77− [CompletionResult]::new('-b', 'b', [CompletionResultType]::ParameterName, 'Initialize (or update) the syntax/theme cache.')
78− [CompletionResult]::new('--build', 'build', [CompletionResultType]::ParameterName, 'Initialize (or update) the syntax/theme cache.')
79− [CompletionResult]::new('-c', 'c', [CompletionResultType]::ParameterName, 'Remove the cached syntax definitions and themes.')
80− [CompletionResult]::new('--clear', 'clear', [CompletionResultType]::ParameterName, 'Remove the cached syntax definitions and themes.')
81− [CompletionResult]::new('--blank', 'blank', [CompletionResultType]::ParameterName, 'Create completely new syntax and theme sets (instead of appending to the default sets).')
82− [CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Prints help information')
83− [CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Prints help information')
84− [CompletionResult]::new('-V', 'V', [CompletionResultType]::ParameterName, 'Prints version information')
85− [CompletionResult]::new('--version', 'version', [CompletionResultType]::ParameterName, 'Prints version information')
86− break
87− }
88− })
89−
90− $completions.Where{ $_.CompletionText -like "$wordToComplete*" } |
91− Sort-Object -Property ListItemText
92−}
assets/completions/bat.bash.indeleted−101
@@ -1,101 +0,0 @@
1−# shellcheck disable=SC2207
2−
3−# Requires https://github.com/scop/bash-completion
4−
5−# Macs have bash3 for which the bash-completion package doesn't include
6−# _init_completion. This is a minimal version of that function.
7−__bat_init_completion()
8−{
9− COMPREPLY=()
10− _get_comp_words_by_ref "$@" cur prev words cword
11−}
12−
13−_bat() {
14− local cur prev words cword split=false
15− if declare -F _init_completion >/dev/null 2>&1; then
16− _init_completion -s || return 0
17− else
18− __bat_init_completion -n "=" || return 0
19− _split_longopt && split=true
20− fi
21−
22− if [[ ${words[1]-} == cache ]]; then
23− case $prev in
24− --source | --target)
25− _filedir -d
26− return 0
27− ;;
28− esac
29− COMPREPLY=($(compgen -W "
30− --build --clear --source --target --blank --help
31− " -- "$cur"))
32− return 0
33− fi
34−
35− case $prev in
36− -l | --language)
37− local IFS=$'\n'
38− COMPREPLY=($(compgen -W "$(
39− "$1" --list-languages | while IFS=: read -r lang _; do
40− printf "%s\n" "$lang"
41− done
42− )" -- "$cur"))
43− compopt -o filenames # for escaping
44− return 0
45− ;;
46− -H | --highlight-line | --diff-context | --tabs | --terminal-width | \
47− -m | --map-syntax | --style | --line-range | -h | --help | -V | \
48− --version | --diagnostic | --config-file | --config-dir | \
49− --cache-dir | --generate-config-file)
50− # argument required but no completion available, or option
51− # causes an exit
52− return 0
53− ;;
54− --file-name)
55− _filedir
56− return 0
57− ;;
58− --wrap)
59− COMPREPLY=($(compgen -W "auto never character" -- "$cur"))
60− return 0
61− ;;
62− --color | --decorations | --paging)
63− COMPREPLY=($(compgen -W "auto never always" -- "$cur"))
64− return 0
65− ;;
66− --italic-text)
67− COMPREPLY=($(compgen -W "always never" -- "$cur"))
68− return 0
69− ;;
70− --pager)
71− COMPREPLY=($(compgen -c -- "$cur"))
72− return 0
73− ;;
74− --theme)
75− local IFS=$'\n'
76− COMPREPLY=($(compgen -W "$("$1" --list-themes)" -- "$cur"))
77− compopt -o filenames # for escaping
78− return 0
79− ;;
80− esac
81−
82− $split && return 0
83−
84− if [[ $cur == -* ]]; then
85− COMPREPLY=($(compgen -W "
86− --show-all --plain --language --highlight-line
87− --file-name --diff --diff-context --tabs --wrap
88− --terminal-width --number --color --italic-text
89− --decorations --paging --pager --map-syntax --theme
90− --list-themes --style --line-range --list-languages
91− --help --version --force-colorization --unbuffered
92− --diagnostic --config-file --config-dir --cache-dir
93− --generate-config-file
94− " -- "$cur"))
95− return 0
96− fi
97−
98− _filedir
99− ((cword == 1)) && COMPREPLY+=($(compgen -W cache -- "$cur"))
100−
101−} && complete -F _bat {{PROJECT_EXECUTABLE}}
assets/completions/bat.fish.in+2−2
@@ -34,7 +34,7 @@ complete -c {{PROJECT_EXECUTABLE}} -s H -l highlight-line -x -d "<N> Highlight t
34
34
35complete -c {{PROJECT_EXECUTABLE}} -l italic-text -xka "always never" -d "Specify when to use ANSI sequences for italic text (default: never)" -n "not __fish_seen_subcommand_from cache"
35complete -c {{PROJECT_EXECUTABLE}} -l italic-text -xka "always never" -d "Specify when to use ANSI sequences for italic text (default: never)" -n "not __fish_seen_subcommand_from cache"
36
36
37−complete -c {{PROJECT_EXECUTABLE}} -s l -l language -d "Set the language for syntax highlighting" -n "not __fish_seen_subcommand_from cache" -xa "(__{{PROJECT_EXECUTABLE}}_autocomplete_languages)"
37+complete -c {{PROJECT_EXECUTABLE}} -s l -l language -d "Set the language for syntax highlighting" -n "not __fish_seen_subcommand_from cache" -xa "(__{{PROJECT_EXECUTABLE}}_autocomplete_languages)"
38
38
39complete -c {{PROJECT_EXECUTABLE}} -s r -l line-range -x -d "<N:M> Only print the specified range of lines for each file" -n "not __fish_seen_subcommand_from cache"
39complete -c {{PROJECT_EXECUTABLE}} -s r -l line-range -x -d "<N:M> Only print the specified range of lines for each file" -n "not __fish_seen_subcommand_from cache"
40
40
@@ -56,7 +56,7 @@ complete -c {{PROJECT_EXECUTABLE}} -s P -d "Disable paging. Alias for '--paging=
56
56
57complete -c {{PROJECT_EXECUTABLE}} -s A -l show-all -d "Show non-printable characters like space/tab/newline" -n "not __fish_seen_subcommand_from cache"
57complete -c {{PROJECT_EXECUTABLE}} -s A -l show-all -d "Show non-printable characters like space/tab/newline" -n "not __fish_seen_subcommand_from cache"
58
58
59−complete -c {{PROJECT_EXECUTABLE}} -l style -xka "default auto full plain changes header header-filename header-filesize grid rule numbers snip" -d "Comma-separated list of style elements or presets to display with file contents" -n "not __fish_seen_subcommand_from cache"
59+complete -c {{PROJECT_EXECUTABLE}} -l style -xka "auto full plain changes header grid numbers" -d "Comma-separated list of style elements or presets to display with file contents" -n "not __fish_seen_subcommand_from cache"
60
60
61complete -c {{PROJECT_EXECUTABLE}} -l tabs -x -d "<T> Set the tab width to T spaces (width of 0 passes tabs through directly)" -n "not __fish_seen_subcommand_from cache"
61complete -c {{PROJECT_EXECUTABLE}} -l tabs -x -d "<T> Set the tab width to T spaces (width of 0 passes tabs through directly)" -n "not __fish_seen_subcommand_from cache"
62
62
assets/completions/bat.zsh.in+11−17
@@ -3,8 +3,8 @@
3local context state state_descr line
3local context state state_descr line
4typeset -A opt_args
4typeset -A opt_args
5
5
6−(( $+functions[_{{PROJECT_EXECUTABLE}}_cache_subcommand] )) ||
6+(( $+functions[_cache_subcommand] )) ||
7−_{{PROJECT_EXECUTABLE}}_cache_subcommand() {
7+_cache_subcommand() {
8 local -a args
8 local -a args
9 args=(
9 args=(
10 '(-b --build -c --clear)'{-b,--build}'[Initialize or update the syntax/theme cache]'
10 '(-b --build -c --clear)'{-b,--build}'[Initialize or update the syntax/theme cache]'
@@ -19,12 +19,12 @@ _{{PROJECT_EXECUTABLE}}_cache_subcommand() {
19 _arguments -S -s $args
19 _arguments -S -s $args
20}
20}
21
21
22−(( $+functions[_{{PROJECT_EXECUTABLE}}_main] )) ||
22+(( $+functions[_main] )) ||
23−_{{PROJECT_EXECUTABLE}}_main() {
23+_main() {
24 local -a args
24 local -a args
25 args=(
25 args=(
26 '(-A --show-all)'{-A,--show-all}'[Show non-printable characters (space, tab, newline, ..)]'
26 '(-A --show-all)'{-A,--show-all}'[Show non-printable characters (space, tab, newline, ..)]'
27− '*'{-p,--plain}'[Show plain style (alias for `--style=plain`), repeat twice to disable disable automatic paging (alias for `--paging=never`)]'
27+ {-p,--plain}'[Show plain style (alias for `--style=plain`)]:When `-p` is used twice (`-pp`), it also disables automatic paging (alias for `--style=plain --paging=never`)'
28 '(-l --language)'{-l+,--language=}'[Set the language for syntax highlighting]:<language>:->language'
28 '(-l --language)'{-l+,--language=}'[Set the language for syntax highlighting]:<language>:->language'
29 '(-H --highlight-line)'{-H,--highlight-line}'[Highlight lines N through M]:<N\:M>...'
29 '(-H --highlight-line)'{-H,--highlight-line}'[Highlight lines N through M]:<N\:M>...'
30 '(--file-name)'--file-name'[Specify the name to display for a file]:<name>...:_files'
30 '(--file-name)'--file-name'[Specify the name to display for a file]:<name>...:_files'
@@ -44,12 +44,6 @@ _{{PROJECT_EXECUTABLE}}_main() {
44 '(--style)'--style='[Comma-separated list of style elements to display]:<components>:->style'
44 '(--style)'--style='[Comma-separated list of style elements to display]:<components>:->style'
45 '(-r --line-range)'{-r+,--line-range=}'[Only print the lines from N to M]:<N\:M>...'
45 '(-r --line-range)'{-r+,--line-range=}'[Only print the lines from N to M]:<N\:M>...'
46 '(: --list-themes --list-languages -L)'{-L,--list-languages}'[Display all supported languages]'
46 '(: --list-themes --list-languages -L)'{-L,--list-languages}'[Display all supported languages]'
47− '(: --no-config)'--no-config'[Do not use the configuration file]'
48− '(: --no-custom-assets)'--no-custom-assets'[Do not load custom assets]'
49− '(: --config-dir)'--config-dir'[Show bat'"'"'s configuration directory]'
50− '(: --config-file)'--config-file'[Show path to the configuration file]'
51− '(: --generate-config-file)'--generate-config-file'[Generates a default configuration file]'
52− '(: --cache-dir)'--cache-dir'[Show bat'"'"'s cache directory]'
53 '(: -)'{-h,--help}'[Print this help message]'
47 '(: -)'{-h,--help}'[Print this help message]'
54 '(: -)'{-V,--version}'[Show version information]'
48 '(: -)'{-V,--version}'[Show version information]'
55 '*: :_files'
49 '*: :_files'
@@ -57,13 +51,13 @@ _{{PROJECT_EXECUTABLE}}_main() {
57
51
58 _arguments -S -s $args
52 _arguments -S -s $args
59
53
60− case "$state" in
54+ case "$state" in
61 language)
55 language)
62 local IFS=$'\n'
56 local IFS=$'\n'
63 local -a languages
57 local -a languages
64 languages=( $({{PROJECT_EXECUTABLE}} --list-languages | awk -F':|,' '{ for (i = 1; i <= NF; ++i) printf("%s:%s\n", $i, $1) }') )
58 languages=( $({{PROJECT_EXECUTABLE}} --list-languages | awk -F':|,' '{ for (i = 1; i <= NF; ++i) printf("%s:%s\n", $i, $1) }') )
65
59
66− _describe 'language' languages
60+ _describe 'language' languages
67 ;;
61 ;;
68
62
69 theme)
63 theme)
@@ -75,7 +69,7 @@ _{{PROJECT_EXECUTABLE}}_main() {
75 ;;
69 ;;
76
70
77 style)
71 style)
78− _values -s , 'style' default auto full plain changes header header-filename header-filesize grid rule numbers snip
72+ _values -s , 'style' auto full plain changes header grid numbers snip
79 ;;
73 ;;
80 esac
74 esac
81}
75}
@@ -85,15 +79,15 @@ if (( ${#words} == 2 )); then
85 local -a subcommands
79 local -a subcommands
86 subcommands=('cache:Modify the syntax-definition and theme cache')
80 subcommands=('cache:Modify the syntax-definition and theme cache')
87 _describe subcommand subcommands
81 _describe subcommand subcommands
88− _{{PROJECT_EXECUTABLE}}_main
82+ _main
89else
83else
90 case $words[2] in
84 case $words[2] in
91 cache)
85 cache)
92− _{{PROJECT_EXECUTABLE}}_cache_subcommand
86+ _cache_subcommand
93 ;;
87 ;;
94
88
95 *)
89 *)
96− _{{PROJECT_EXECUTABLE}}_main
90+ _main
97 ;;
91 ;;
98 esac
92 esac
99fi
93fi
assets/create.sh+8−14
@@ -5,7 +5,7 @@ ASSET_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
5REPO_DIR="$ASSET_DIR/.."
5REPO_DIR="$ASSET_DIR/.."
6
6
7# Ensure submodules are initialized.
7# Ensure submodules are initialized.
8−update_submodules() {
8+function update_submodules() {
9 local submodule
9 local submodule
10 local submodule_prompt=unspecified
10 local submodule_prompt=unspecified
11 local submodule_path
11 local submodule_path
@@ -46,7 +46,6 @@ bat cache --clear
46# - Remove the JavaDoc patch once https://github.com/trishume/syntect/issues/222 has been fixed
46# - Remove the JavaDoc patch once https://github.com/trishume/syntect/issues/222 has been fixed
47# - Remove the C# patch once https://github.com/sublimehq/Packages/pull/2331 has been merged
47# - Remove the C# patch once https://github.com/sublimehq/Packages/pull/2331 has been merged
48
48
49−# Apply patches
50(
49(
51 cd "$ASSET_DIR"
50 cd "$ASSET_DIR"
52 for patch in patches/*.patch; do
51 for patch in patches/*.patch; do
@@ -54,16 +53,11 @@ bat cache --clear
54 done
53 done
55)
54)
56
55
57−reverse_patches() {
56+bat cache --build --blank --source="$ASSET_DIR" --target="$ASSET_DIR"
58− (
59− cd "$ASSET_DIR"
60− for patch in patches/*.patch; do
61− patch --strip=0 --reverse <"$patch"
62− done
63− )
64−}
65−
66−# Make sure to always reverse patches, even if the `bat cache` command fails or aborts
67−trap reverse_patches EXIT
68
57
69−bat cache --build --blank --acknowledgements --source="$ASSET_DIR" --target="$ASSET_DIR"
58+(
59+ cd "$ASSET_DIR"
60+ for patch in patches/*.patch; do
61+ patch --strip=0 --reverse < "$patch"
62+ done
63+)
assets/manual/bat.1.in+3−27
@@ -40,7 +40,7 @@ language names and file extensions.
40.HP
40.HP
41\fB\-H\fR, \fB\-\-highlight\-line\fR <N:M>...
41\fB\-H\fR, \fB\-\-highlight\-line\fR <N:M>...
42.IP
42.IP
43−Highlight the specified line ranges with a different background color. For example:
43+Highlight the specified line ranges with a different background color For example:
44.RS
44.RS
45.IP "\-\-highlight\-line 40"
45.IP "\-\-highlight\-line 40"
46highlights line 40
46highlights line 40
@@ -50,22 +50,8 @@ highlights lines 30 to 40
50highlights lines 1 to 40
50highlights lines 1 to 40
51.IP "\-\-highlight\-line 40:"
51.IP "\-\-highlight\-line 40:"
52highlights lines 40 to the end of the file
52highlights lines 40 to the end of the file
53−.IP "\-\-highlight\-line 30:+10"
54−highlights lines 30 to 40
55.RE
53.RE
56.HP
54.HP
57−\fB\-\-file\-name\fR <name>...
58−.IP
59−Specify the name to display for a file. Useful when piping data to {{PROJECT_EXECUTABLE}} from STDIN when {{PROJECT_EXECUTABLE}} does not otherwise know the filename. Note that the provided file name is also used for syntax detection.
60−.HP
61−\fB\-d\fR, \fB\-\-diff\fR
62−.IP
63−Only show lines that have been added/removed/modified with respect to the Git index. Use '\-\-diff\-context=N' to control how much context you want to see.
64−.HP
65−\fB\-\-diff\-context\fR <N>...
66−.IP
67−Include N lines of context around added/removed/modified lines when using '\-\-diff'.
68−.HP
69\fB\-\-tabs\fR <T>
55\fB\-\-tabs\fR <T>
70.IP
56.IP
71Set the tab width to T spaces. Use a width of 0 to pass tabs through directly
57Set the tab width to T spaces. Use a width of 0 to pass tabs through directly
@@ -118,8 +104,6 @@ which pager is used, see the '\-\-pager' option. Possible values: *auto*, never,
118Determine which pager is used. This option will override the PAGER and BAT_PAGER
104Determine which pager is used. This option will override the PAGER and BAT_PAGER
119environment variables. The default pager is 'less'. To control when the pager is used, see
105environment variables. The default pager is 'less'. To control when the pager is used, see
120the '\-\-paging' option. Example: '\-\-pager "less \fB\-RF\fR"'.
106the '\-\-paging' option. Example: '\-\-pager "less \fB\-RF\fR"'.
121−
122−Note: By default, if the pager is set to 'less' (and no command-line options are specified), 'bat' will pass the following command line options to the pager: '-R'/'--RAW-CONTROL-CHARS', '-F'/'--quit-if-one-screen' and '-X'/'--no-init'. The last option ('-X') is only used for 'less' versions older than 530. The '-R' option is needed to interpret ANSI colors correctly. The second option ('-F') instructs less to exit immediately if the output size is smaller than the vertical size of the terminal. This is convenient for small files because you do not have to press 'q' to quit the pager. The third option ('-X') is needed to fix a bug with the '--quit-if-one-screen' feature in old versions of 'less'. Unfortunately, it also breaks mouse-wheel support in 'less'. If you want to enable mouse-wheel scrolling on older versions of 'less', you can pass just '-R' (as in the example above, this will disable the quit-if-one-screen feature). For less 530 or newer, it should work out of the box.
123.HP
107.HP
124\fB\-m\fR, \fB\-\-map\-syntax\fR <glob-pattern:syntax-name>...
108\fB\-m\fR, \fB\-\-map\-syntax\fR <glob-pattern:syntax-name>...
125.IP
109.IP
@@ -127,7 +111,6 @@ Map a glob pattern to an existing syntax name. The glob pattern is matched on th
127path and the filename. For example, to highlight *.build files with the Python syntax,
111path and the filename. For example, to highlight *.build files with the Python syntax,
128use -m '*.build:Python'. To highlight files named '.myignore' with the Git Ignore
112use -m '*.build:Python'. To highlight files named '.myignore' with the Git Ignore
129syntax, use -m '.myignore:Git Ignore'.
113syntax, use -m '.myignore:Git Ignore'.
130−Note that the right-hand side is the *name* of the syntax, not a file extension.
131.HP
114.HP
132\fB\-\-theme\fR <theme>
115\fB\-\-theme\fR <theme>
133.IP
116.IP
@@ -146,8 +129,7 @@ Configure which elements (line numbers, file headers, grid borders, Git modifica
146of components to display (e.g. 'numbers,changes,grid') or a pre\-defined style ('full').
129of components to display (e.g. 'numbers,changes,grid') or a pre\-defined style ('full').
147To set a default style, add the '\-\-style=".."' option to the configuration file or
130To set a default style, add the '\-\-style=".."' option to the configuration file or
148export the BAT_STYLE environment variable (e.g.: export BAT_STYLE=".."). Possible
131export the BAT_STYLE environment variable (e.g.: export BAT_STYLE=".."). Possible
149−values: *default*, full, auto, plain, changes, header, header-filename, header-filesize, grid,
132+values: *auto*, full, plain, changes, header, grid, numbers, snip.
150−rule, numbers, snip.
151.HP
133.HP
152\fB\-r\fR, \fB\-\-line\-range\fR <N:M>...
134\fB\-r\fR, \fB\-\-line\-range\fR <N:M>...
153.IP
135.IP
@@ -159,8 +141,6 @@ prints lines 30 to 40
159prints lines 1 to 40
141prints lines 1 to 40
160.IP "\-\-line\-range 40:"
142.IP "\-\-line\-range 40:"
161prints lines 40 to the end of the file
143prints lines 40 to the end of the file
162−.IP "\-\-line\-range 30:+10"
163−prints lines 30 to 40
164.RE
144.RE
165.HP
145.HP
166\fB\-L\fR, \fB\-\-list\-languages\fR
146\fB\-L\fR, \fB\-\-list\-languages\fR
@@ -196,10 +176,6 @@ is dependent on your operating system. To get the default path for your system,
196
176
197Alternatively, you can use the BAT_CONFIG_PATH environment variable to point {{PROJECT_EXECUTABLE}} to a non-default
177Alternatively, you can use the BAT_CONFIG_PATH environment variable to point {{PROJECT_EXECUTABLE}} to a non-default
198location of the configuration file.
178location of the configuration file.
199−
200−To generate a default configuration file, call:
201−
202−\fB{{PROJECT_EXECUTABLE}} --generate-config-file\fR
203.SH "ADDING CUSTOM LANGUAGES"
179.SH "ADDING CUSTOM LANGUAGES"
204{{PROJECT_EXECUTABLE}} supports Sublime Text \fB.sublime-syntax\fR language files, and can be
180{{PROJECT_EXECUTABLE}} supports Sublime Text \fB.sublime-syntax\fR language files, and can be
205customized to add additional languages to your local installation. To do this, add the \fB.sublime-syntax\fR language
181customized to add additional languages to your local installation. To do this, add the \fB.sublime-syntax\fR language
@@ -225,7 +201,7 @@ git clone https://github.com/tellnobody1/sublime-purescript-syntax
225
201
226Once the cache is built, the new language will be visible in `\fB{{PROJECT_EXECUTABLE}} --list-languages\fR`.
202Once the cache is built, the new language will be visible in `\fB{{PROJECT_EXECUTABLE}} --list-languages\fR`.
227.br
203.br
228−If you ever want to remove the custom languages, you can clear the cache with `\fB{{PROJECT_EXECUTABLE}} cache --clear\fR`.
204+If you ever want to remove the custom languages, you can clear the cache with `\fB{{PROJECT_EXECUTABLE}} cache --clear\fR`.
229
205
230.SH "ADDING CUSTOM THEMES"
206.SH "ADDING CUSTOM THEMES"
231Similarly to custom languages, {{PROJECT_EXECUTABLE}} supports Sublime Text \fB.tmTheme\fR themes.
207Similarly to custom languages, {{PROJECT_EXECUTABLE}} supports Sublime Text \fB.tmTheme\fR themes.
assets/patches/Groff.sublime-syntax.patchdeleted−16
@@ -1,16 +0,0 @@
1−diff --git syntaxes/02_Extra/Groff/Man Page/Man Page.sublime-syntax syntaxes/02_Extra/Groff/Man Page/Man Page.sublime-syntax
2−index 57834af..6648664 100644
3−--- syntaxes/02_Extra/Groff/Man Page/Man Page.sublime-syntax
4−+++ syntaxes/02_Extra/Groff/Man Page/Man Page.sublime-syntax
5−@@ -4,9 +4,9 @@
6− # - man-pages(7)
7− # - groff(7)
8− ---
9−-name: Man Page (groff/troff)
10−+name: Groff/troff
11− scope: text.groff
12−-file_extensions: [man, groff, troff, '1', '2', '3', '4', '5', '6', '7']
13−+file_extensions: [groff, troff, '1', '2', '3', '4', '5', '6', '7', '8', '9']
14−
15− contexts:
16− main:
assets/patches/Markdown.sublime-syntax.patch+1−10
@@ -1,5 +1,5 @@
1diff --git syntaxes/01_Packages/Markdown/Markdown.sublime-syntax syntaxes/01_Packages/Markdown/Markdown.sublime-syntax
1diff --git syntaxes/01_Packages/Markdown/Markdown.sublime-syntax syntaxes/01_Packages/Markdown/Markdown.sublime-syntax
2−index 19dc685d..44440c7f 100644
2+index 19dc685d..6afd87ae 100644
3--- syntaxes/01_Packages/Markdown/Markdown.sublime-syntax
3--- syntaxes/01_Packages/Markdown/Markdown.sublime-syntax
4+++ syntaxes/01_Packages/Markdown/Markdown.sublime-syntax
4+++ syntaxes/01_Packages/Markdown/Markdown.sublime-syntax
5@@ -24,7 +24,6 @@ variables:
5@@ -24,7 +24,6 @@ variables:
@@ -166,12 +166,3 @@ index 19dc685d..44440c7f 100644
166 - match: ^\s*$\n?
166 - match: ^\s*$\n?
167 scope: invalid.illegal.non-terminated.bold-italic.markdown
167 scope: invalid.illegal.non-terminated.bold-italic.markdown
168 pop: true
168 pop: true
169−@@ -1152,7 +1110,7 @@ contexts:
170− - match: |-
171− (?x)
172− {{fenced_code_block_start}}
173−- ((?i:rust))
174−+ ((?i:rust|rs))
175− {{fenced_code_block_trailing_infostring_characters}}
176− captures:
177− 0: meta.code-fence.definition.begin.rust.markdown-gfm
assets/patches/MediaWiki.sublime-syntax.patchdeleted−13
@@ -1,13 +0,0 @@
1−diff --git syntaxes/02_Extra/MediaWiki/MediawikiNG.sublime-syntax syntaxes/02_Extra/MediaWiki/MediawikiNG.sublime-syntax
2−index f542c9e..8eaf020 100644
3−--- syntaxes/02_Extra/MediaWiki/MediawikiNG.sublime-syntax
4−+++ syntaxes/02_Extra/MediaWiki/MediawikiNG.sublime-syntax
5−@@ -1,7 +1,7 @@
6− %YAML 1.2
7− ---
8− # http://www.sublimetext.com/docs/3/syntax.html
9−-name: Mediawiki NG
10−+name: MediaWiki
11− file_extensions: [mediawiki, wikipedia, wiki]
12− scope: text.html.mediawiki
13−
assets/patches/Monokai-Extended.tmTheme.patchdeleted−36
@@ -1,36 +0,0 @@
1−diff --git themes/sublime-monokai-extended/Monokai\ Extended.tmTheme themes/sublime-monokai-extended/Monokai\ Extended.tmTheme
2−index 9c2aa3e..180cbbf 100644
3−--- themes/sublime-monokai-extended/Monokai Extended.tmTheme
4−+++ themes/sublime-monokai-extended/Monokai Extended.tmTheme
5−@@ -810,11 +810,11 @@
6− <key>name</key>
7− <string>JSON String</string>
8− <key>scope</key>
9−- <string>meta.structure.dictionary.json string.quoted.double.json</string>
10−+ <string>meta.mapping.key.json string.quoted.double.json, punctuation.separator.sequence.csv</string>
11− <key>settings</key>
12− <dict>
13− <key>foreground</key>
14−- <string>#cfcfc2</string>
15−+ <string>#fd971f</string>
16− </dict>
17− </dict>
18− <dict>
19−@@ -1027,7 +1027,7 @@
20− <key>name</key>
21− <string>Invalid</string>
22− <key>scope</key>
23−- <string>invalid</string>
24−+ <string>invalid, markup.error</string>
25− <key>settings</key>
26− <dict>
27− <key>background</key>
28−@@ -1042,7 +1042,7 @@
29− <key>name</key>
30− <string>Invalid deprecated</string>
31− <key>scope</key>
32−- <string>invalid.deprecated</string>
33−+ <string>invalid.deprecated, markup.warning</string>
34− <key>settings</key>
35− <dict>
36− <key>background</key>
assets/patches/Python.sublime-syntax.patchdeleted−15
@@ -1,15 +0,0 @@
1−diff --git syntaxes/01_Packages/Python/Python.sublime-syntax syntaxes/01_Packages/Python/Python.sublime-syntax
2−index 2acd86d8..86257f7b 100644
3−--- syntaxes/01_Packages/Python/Python.sublime-syntax
4−+++ syntaxes/01_Packages/Python/Python.sublime-syntax
5−@@ -988,10 +988,6 @@ contexts:
6− - match: \}
7− scope: punctuation.section.mapping-or-set.end.python
8− set: after-expression
9−- - match: (?={{simple_expression}}:|\s*\*\*)
10−- set: inside-dictionary
11−- - match: (?={{simple_expression}}[,}]|\s*\*)
12−- set: inside-set
13− - match: ','
14− scope: punctuation.separator.set.python
15− set: inside-set
assets/patches/ShellScript.sublime-syntax.patchdeleted−20
@@ -1,20 +0,0 @@
1−diff --git syntaxes/01_Packages/ShellScript/Bash.sublime-syntax syntaxes/01_Packages/ShellScript/Bash.sublime-syntax
2−index e973e319..07c170a7 100644
3−--- syntaxes/01_Packages/ShellScript/Bash.sublime-syntax
4−+++ syntaxes/01_Packages/ShellScript/Bash.sublime-syntax
5−@@ -30,12 +30,12 @@ file_extensions:
6− - .zshenv
7− - .zshrc
8− - PKGBUILD # https://jlk.fjfi.cvut.cz/arch/manpages/man/PKGBUILD.5
9−- - .ebuild
10−- - .eclass
11−+ - ebuild
12−+ - eclass
13−
14− first_line_match: |
15− (?x)
16−- ^\#! .* \b(bash|zsh|sh|tcsh|ash)\b
17−+ ^\#! .* \b(bash|zsh|sh|tcsh|ash|dash)\b
18− | ^\# \s* -\*- [^*]* mode: \s* shell-script [^*]* -\*-
19−
20− #-------------------------------------------------------------------------------
assets/patches/XML.sublime-syntax.patchdeleted−12
@@ -1,12 +0,0 @@
1−diff --git syntaxes/01_Packages/XML/XML.sublime-syntax syntaxes/01_Packages/XML/XML.sublime-syntax
2−index ad7d9c87..af4a00f0 100644
3−--- syntaxes/01_Packages/XML/XML.sublime-syntax
4−+++ syntaxes/01_Packages/XML/XML.sublime-syntax
5−@@ -12,6 +12,7 @@ file_extensions:
6− - rss
7− - opml
8− - svg
9−+ - xaml
10− first_line_match: |-
11− (?x:
12− ^(?:
assets/syntaxes.bin

Binary file not shown.

assets/syntaxes/02_Extra/AWK+1−1

Submodule changed.

assets/syntaxes/02_Extra/CMake+1−1

Submodule changed.

assets/syntaxes/02_Extra/CSVnew file+1

Submodule changed.

assets/syntaxes/02_Extra/CSV.sublime-syntax+39−71
@@ -1,78 +1,46 @@
1%YAML 1.2
1%YAML 1.2
2---
2---
3−# See http://www.sublimetext.com/docs/3/syntax.html
3+# http://www.sublimetext.com/docs/3/syntax.html
4−name: Comma Separated Values
4+name: Advanced CSV
5file_extensions:
5file_extensions:
6 - csv
6 - csv
7 - tsv
7 - tsv
8−scope: text.csv
8+scope: text.advanced_csv
9−variables:
10− field_separator: (?:[,;\t])
11− record_separator: (?:$\n?)
12contexts:
9contexts:
13− prototype:
14− - match: (?={{record_separator}})
15− pop: true
16− fields:
17− - match: ''
18− push:
19− - field_or_record_separator
20− - field4
21− - field_or_record_separator
22− - field3
23− - field_or_record_separator
24− - field2
25− - field_or_record_separator
26− - field1
27 main:
10 main:
28− - meta_include_prototype: false
29− - match: '^'
11+ - match: (\")
30− set: fields
12+ captures:
31−
13+ 1: string.quoted.double.advanced_csv
32− field_or_record_separator:
14+ push:
33− - meta_include_prototype: false
15+ - meta_scope: meta.quoted.advanced_csv
34− - match: '{{record_separator}}'
35− scope: punctuation.terminator.record.csv
36− pop: true
37− - match: '{{field_separator}}'
38− scope: punctuation.separator.sequence.csv
39− pop: true
40−
41− field_contents:
42− - match: '"'
16+ - match: (\")
43− scope: punctuation.definition.string.begin.csv
17+ captures:
44− push: double_quoted_string
45−
46− - match: (?={{field_separator}}|{{record_separator}})
47− pop: true
48−
49− double_quoted_string:
50− - meta_include_prototype: false
51− - meta_scope: string.quoted.double.csv
18+ 1: string.quoted.double.advanced_csv
52− - match: '""'
53− scope: constant.character.escape.csv
54− - match: '"'
55− scope: punctuation.definition.string.end.csv
56− pop: true
19+ pop: true
57−
58− field1:
59− - match: ''
60− set:
61− - meta_content_scope: meta.field-1.csv support.type
62− - include: field_contents
20+ - include: main
63− field2:
64− - match: ''
21+ - match: '(\[([+-]?\d*)(\:)?([+-]?\d*)(\,)?([+-]?\d*)(\:)?([+-]?\d*)\])?\s*([<>v^])?\s*(=)'
65− set:
22+ captures:
66− - meta_content_scope: meta.field-2.csv support.function
23+ 1: keyword.operator.advanced_csv
67− - include: field_contents
24+ 2: constant.numeric.formula.advanced_csv
68− field3:
25+ 4: constant.numeric.formula.advanced_csv
69− - match: ''
26+ 6: constant.numeric.formula.advanced_csv
70− set:
27+ 8: constant.numeric.formula.advanced_csv
71− - meta_content_scope: meta.field-3.csv constant.numeric
28+ 9: keyword.operator.advanced_csv
72− - include: field_contents
73− field4:
74− - match: ''
75− set:
76− - meta_content_scope: meta.field-4.csv keyword.operator
29+ 10: keyword.operator.advanced_csv
77− - include: field_contents
30+ push:
78−
31+ - meta_scope: meta.range.advanced_csv
32+ - match: (?=(\")|$)
33+ pop: true
34+ - include: scope:source.python
35+ - match: '(?<=^|,|\s|\")([0-9.eE+-]+)(?=$|,|\s|\")'
36+ scope: meta.number.advanced_csv
37+ captures:
38+ 1: constant.numeric.advanced_csv
39+ - match: '(?<=^|,|\s|\")([^, \t\"]+)(?=$|,|\s|\")'
40+ scope: meta.nonnumber.advanced_csv
41+ captures:
42+ 1: storage.type.advanced_csv
43+ - match: (\,)
44+ scope: meta.delimiter.advanced_csv
45+ captures:
46+ 1: keyword.operator.advanced_csv
assets/syntaxes/02_Extra/Crystal+1−1

Submodule changed.

assets/syntaxes/02_Extra/Dart+1−1

Submodule changed.

assets/syntaxes/02_Extra/Dart.sublime-syntax+243−85
@@ -1,6 +1,6 @@
1%YAML 1.2
1%YAML 1.2
2---
2---
3−# http://www.sublimetext.com/docs/syntax.html
3+# http://www.sublimetext.com/docs/3/syntax.html
4name: Dart
4name: Dart
5file_extensions:
5file_extensions:
6 - dart
6 - dart
@@ -9,7 +9,7 @@ contexts:
9 main:
9 main:
10 - match: ^(#!.*)$
10 - match: ^(#!.*)$
11 scope: meta.preprocessor.script.dart
11 scope: meta.preprocessor.script.dart
12− - match: ^\w*\b(library|import|part of|part|export)\b
12+ - match: ^\s*\b(library|import|export|part of|part)\b
13 captures:
13 captures:
14 0: keyword.other.import.dart
14 0: keyword.other.import.dart
15 push:
15 push:
@@ -19,114 +19,242 @@ contexts:
19 0: punctuation.terminator.dart
19 0: punctuation.terminator.dart
20 pop: true
20 pop: true
21 - include: strings
21 - include: strings
22− - include: comments
23− - match: \b(as|show|hide)\b
22+ - match: \b(as|show|hide|deferred)\b
24 scope: keyword.other.import.dart
23 scope: keyword.other.import.dart
25 - include: comments
24 - include: comments
26− - include: punctuation
25+ - include: constants-and-special-vars
27 - include: annotations
26 - include: annotations
27+ - include: decl-typedef
28+ - include: decl-class
29+ - include: decl-enum
30+ - include: decl-function
28 - include: keywords
31 - include: keywords
29− - include: constants-and-special-vars
30 - include: strings
32 - include: strings
31 annotations:
33 annotations:
32− - match: '@[a-zA-Z]+'
34+ - match: '^(?:\s*)((@)([a-zA-Z0-9_]+))'
33− scope: storage.type.annotation.dart
35+ captures:
36+ 1: annotation.dart
37+ 2: entity.name.function.annotation.dart
38+ 3: support.type.dart
34 comments:
39 comments:
35 - match: /\*\*/
40 - match: /\*\*/
36 scope: comment.block.empty.dart
41 scope: comment.block.empty.dart
37 captures:
42 captures:
38 0: punctuation.definition.comment.dart
43 0: punctuation.definition.comment.dart
39− - include: comments-doc-oldschool
40− - include: comments-doc
41 - include: comments-inline
44 - include: comments-inline
42− comments-block:
45+ comments-inline:
43 - match: /\*
46 - match: /\*
44 push:
47 push:
45 - meta_scope: comment.block.dart
48 - meta_scope: comment.block.dart
46 - match: \*/
49 - match: \*/
47 pop: true
50 pop: true
48− - include: comments-block
51+ - include: scope:text.dart-doccomments
49− comments-doc:
50− - match: ///
52+ - match: (///)
53+ captures:
54+ 1: marker.dart
51 push:
55 push:
52− - meta_scope: comment.block.documentation.dart
56+ - meta_scope: comment.line.triple-slash.dart
53− - match: .*
57+ - match: $
54 pop: true
58 pop: true
55− - include: dartdoc
59+ - include: scope:text.dart-doccomments
56− comments-doc-oldschool:
57− - match: /\*\*
60+ - match: (//)
61+ captures:
62+ 1: marker.dart
58 push:
63 push:
59− - meta_scope: comment.block.documentation.dart
64+ - meta_scope: comment.line.double-slash.dart
60− - match: \*/
65+ - match: $
61 pop: true
66 pop: true
62− - include: comments-doc-oldschool
67+ - include: scope:text.dart-doccomments
63− - include: comments-block
64− - include: dartdoc
65− comments-inline:
66− - include: comments-block
67− - match: ((//).*)$
68− captures:
69− 1: comment.line.double-slash.dart
70 constants-and-special-vars:
68 constants-and-special-vars:
71− - match: (?<!\$)\b(true|false|null)\b(?!\$)
69+ - match: \b(true|false|null)\b
72 scope: constant.language.dart
70 scope: constant.language.dart
73− - match: (?<!\$)\b(this|super)\b(?!\$)
71+ - match: \b(this|super)\b
74 scope: variable.language.dart
72 scope: variable.language.dart
75− - match: '(?<!\$)\b((0(x|X)[0-9a-fA-F]*)|(([0-9]+\.?[0-9]*)|(\.[0-9]+))((e|E)(\+|-)?[0-9]+)?)\b(?!\$)'
73+ - match: '\b((0(x|X)[0-9a-fA-F]*)|(([0-9]+\.?[0-9]*)|(\.[0-9]+))((e|E)(\+|-)?[0-9]+)?)\b'
76 scope: constant.numeric.dart
74 scope: constant.numeric.dart
77− - match: '(?<![a-zA-Z0-9_$])([_$]*[A-Z][a-zA-Z0-9_$]*|bool\b|num\b|int\b|double\b|dynamic\b)'
75+ decl-class:
78− scope: support.class.dart
76+ - match: \bclass\b
79− - match: '([_$]*[a-z][a-zA-Z0-9_$]*)(<|\(|\s+=>)'
80 captures:
77 captures:
81− 1: entity.name.function.dart
78+ 0: keyword.control.new.dart
82− dartdoc:
79+ push:
83− - match: '(\[.*?\])'
80+ - meta_scope: meta.declaration.class.dart
81+ - match: "(?={)"
82+ pop: true
83+ - include: keywords
84+ - match: "[A-Za-z_][A-Za-z0-9_]*"
85+ scope: class.name.dart
86+ decl-enum:
87+ - match: \benum\b
88+ captures:
89+ 0: keyword.declaration.dart
90+ push:
91+ - meta_scope: meta.declaration.enum.dart
92+ - match: "(?={)"
93+ pop: true
94+ - include: keywords
95+ - match: "[A-Za-z_][A-Za-z0-9_]*"
96+ scope: enum.name.dart
97+ decl-function:
98+ - match: ^\s*(?:\b(void|bool|num|int|double|dynamic|var|String|List|Map)\b)\s+(get)\s+(\w+)\s+(?==>)
99+ comment: A getter with a primitive return type.
100+ scope: meta.declaration.function.dart
84 captures:
101 captures:
85− 0: variable.name.source.dart
102+ 1: storage.type.primitive.dart
103+ 2: keyword.declaration.dart
104+ 3: function.name.dart
105+ - match: ^\s*(?:\b(\w+)\b\s+)?(get)\s+(\w+)\s+(?==>)
106+ comment: A getter with a user-defined return type or no return type.
107+ scope: meta.declaration.function.dart
108+ captures:
109+ 1: type.user-defined.dart
110+ 2: keyword.declaration.dart
111+ 3: function.name.dart
86− - match: '^ {4,}(?![ \*]).*'
112+ - match: ^\s*(set)\s+(\w+)(?=\()
113+ comment: A setter.
114+ captures:
115+ 1: keyword.declaration.dart
116+ 2: function.name.dart
117+ push:
118+ - meta_scope: meta.declaration.function.dart
119+ - match: \)
120+ pop: true
121+ - include: comments-inline
122+ - include: decl-function-parameter
123+ - include: strings
124+ - include: keywords
125+ - match: ^\s*(?:\b(void|bool|num|int|double|dynamic|var|String|List|Map)\b)\s+(\w+)(?=\()
126+ comment: A function with a primitive return type.
127+ captures:
128+ 1: storage.type.primitive.dart
129+ 2: function.name.dart
130+ push:
131+ - meta_scope: meta.declaration.function.dart
132+ - match: \)
133+ pop: true
134+ - include: comments-inline
135+ - include: decl-function-parameter
136+ - include: strings
137+ - include: keywords
138+ - match: ^\s*(?:\b(return)\b)\s+(\w+)(?=\()
139+ comment: A function invocation after 'return'
140+ captures:
141+ 1: keyword.control.dart
142+ 2: function.name.dart
143+ push:
144+ - meta_scope: meta.invocation.function.dart
145+ - match: \)
146+ pop: true
147+ - include: comments-inline
148+ - include: decl-function-parameter
149+ - include: strings
150+ - include: keywords
151+ - match: ^\s*\b(new)\b\s+(\w+)(?=\()
152+ comment: A class instantiation after 'new'
153+ captures:
154+ 1: keyword.declaration.dart
155+ 2: function.name.dart
156+ push:
157+ - meta_scope: meta.invocation.function.dart
158+ - match: \)
159+ pop: true
160+ - include: comments-inline
161+ - include: decl-function-parameter
162+ - include: strings
163+ - include: keywords
164+ decl-function-parameter:
165+ - include: constants-and-special-vars
166+ - match: (?:\b(void|bool|num|int|double|dynamic|var|String|List|Map)\b)\s+(\w+)(?=\()
167+ comment: A function with a primitive return type.
168+ captures:
169+ 1: storage.type.primitive.dart
170+ 2: function.name.dart
171+ push:
172+ - meta_scope: meta.parameter.function.dart
173+ - match: \)
174+ pop: true
175+ - include: decl-function-parameter
176+ - include: strings
177+ - include: keywords
178+ - match: \b(new)\b\s+(\w+)(?=\()
179+ comment: A class instantiation after 'new'
87 captures:
180 captures:
88− 0: variable.name.source.dart
181+ 1: keyword.declaration.dart
89− - match: '```.*?$'
182+ 2: function.name.dart
90 push:
183 push:
91− - meta_content_scope: variable.other.source.dart
184+ - meta_scope: meta.invocation.function.dart
92− - match: '```'
185+ - match: \)
93 pop: true
186 pop: true
187+ - include: decl-function-parameter
188+ - include: strings
189+ - include: keywords
94− - match: (`.*?`)
190+ - match: (?:\b(\w+)\b)\s+(\w+)(?=\()
191+ comment: A function with a user-defined return type.
95 captures:
192 captures:
96− 0: variable.other.source.dart
193+ 1: type.user-defined.dart
194+ 2: function.name.dart
195+ push:
196+ - meta_scope: meta.parameter.function.dart
197+ - match: \)
198+ pop: true
199+ - include: decl-function-parameter
200+ - include: strings
201+ - include: keywords
97− - match: (`.*?`)
202+ - match: (\w+)(?=\()
203+ comment: A function with no return type.
98 captures:
204 captures:
99− 0: variable.other.source.dart
205+ 1: function.name.dart
206+ push:
207+ - meta_scope: meta.parameter.function.dart
100− - match: (\* (( ).*))$
208+ - match: \)
209+ pop: true
210+ - include: decl-function-parameter
211+ - include: strings
212+ - include: keywords
213+ decl-typedef:
214+ - match: typedef
101 captures:
215 captures:
102− 2: variable.other.source.dart
216+ 0: keyword.control.new.dart
217+ push:
218+ - meta_scope: meta.declaration.typedef.dart
219+ - match: ;
220+ captures:
221+ 0: punctuation.terminator.dart
222+ pop: true
223+ - match: '(?:\b(void|bool|num|int|double|dynamic|var|String|List|Map)\b|([a-zA-Z_][a-zA-Z0-9_]*))\s+([a-zA-Z_][a-zA-Z0-9_]+)'
224+ captures:
225+ 1: storage.type.primitive.dart
226+ 2: typedef.return.dart
227+ 3: typedef.name.dart
103− - match: (\* .*)$
228+ - match: \(
229+ push:
230+ - meta_scope: typedef.params.dart
231+ - match: \)
232+ pop: true
233+ - include: keywords
104 keywords:
234 keywords:
105− - match: (?<!\$)\bas\b(?!\$)
235+ - match: \bassert\b
236+ scope: keyword.control.assert.dart
237+ - match: \bas\b
106 scope: keyword.cast.dart
238 scope: keyword.cast.dart
107− - match: (?<!\$)\b(try|on|catch|finally|throw|rethrow)\b(?!\$)
239+ - match: \b(try|catch|finally|throw|on|rethrow)\b
108 scope: keyword.control.catch-exception.dart
240 scope: keyword.control.catch-exception.dart
241+ - match: \s+\?\s+|\s+:\s+
242+ scope: keyword.control.ternary.dart
109− - match: (?<!\$)\b(break|case|continue|default|do|else|for|if|in|return|switch|while)\b(?!\$)
243+ - match: \b(break|case|continue|default|do|else|for|if|in|return|switch|while)\b
110 scope: keyword.control.dart
244 scope: keyword.control.dart
111− - match: (?<!\$)\b(sync(\*)?|async(\*)?|await|yield(\*)?)\b(?!\$)
245+ - match: \b(async\*|async|await\*|await|yield)\b
112− scope: keyword.control.dart
246+ scope: keyword.control.async.dart
113− - match: (?<!\$)\bassert\b(?!\$)
114− scope: keyword.control.dart
115− - match: (?<!\$)\b(new)\b(?!\$)
247+ - match: \b(new)\b
116 scope: keyword.control.new.dart
248 scope: keyword.control.new.dart
117− - match: (?<!\$)\b(abstract|class|enum|extends|external|factory|implements|get|mixin|native|operator|set|typedef|with|covariant)\b(?!\$)
249+ - match: \b(abstract|extends|external|factory|implements|with|interface|get|native|operator|set|typedef)\b
118 scope: keyword.declaration.dart
250 scope: keyword.declaration.dart
119− - match: (?<!\$)\b(is\!?)\b(?!\$)
251+ - match: \b(is\!?)\b
120 scope: keyword.operator.dart
252 scope: keyword.operator.dart
121− - match: '\?|:'
122− scope: keyword.operator.ternary.dart
123 - match: (<<|>>>?|~|\^|\||&)
253 - match: (<<|>>>?|~|\^|\||&)
124 scope: keyword.operator.bitwise.dart
254 scope: keyword.operator.bitwise.dart
125 - match: ((&|\^|\||<<|>>>?)=)
255 - match: ((&|\^|\||<<|>>>?)=)
126 scope: keyword.operator.assignment.bitwise.dart
256 scope: keyword.operator.assignment.bitwise.dart
127− - match: (=>)
257+ - match: (===?|!==?|<=?|>=?)
128− scope: keyword.operator.closure.dart
129− - match: (==|!=|<=?|>=?)
130 scope: keyword.operator.comparison.dart
258 scope: keyword.operator.comparison.dart
131 - match: '(([+*/%-]|\~)=)'
259 - match: '(([+*/%-]|\~)=)'
132 scope: keyword.operator.assignment.arithmetic.dart
260 scope: keyword.operator.assignment.arithmetic.dart
@@ -138,22 +266,56 @@ contexts:
138 scope: keyword.operator.arithmetic.dart
266 scope: keyword.operator.arithmetic.dart
139 - match: (!|&&|\|\|)
267 - match: (!|&&|\|\|)
140 scope: keyword.operator.logical.dart
268 scope: keyword.operator.logical.dart
141− - match: (?<!\$)\b(static|final|const)\b(?!\$)
142− scope: storage.modifier.dart
143− - match: (?<!\$)\b(?:void|var)\b(?!\$)
144− scope: storage.type.primitive.dart
145− punctuation:
146− - match: ','
147− scope: punctuation.comma.dart
148 - match: ;
269 - match: ;
149 scope: punctuation.terminator.dart
270 scope: punctuation.terminator.dart
271+ - match: \b(static|final|const)\b
272+ scope: storage.modifier.dart
273+ - match: \b(?:void|bool|num|int|double|dynamic|var|String|List|Map)\b
274+ scope: storage.type.primitive.dart
275+ regexp:
276+ - match: '\\[^''"]'
277+ scope: constant.character.escaped.regex.dart
278+ - match: \(
279+ push:
280+ - meta_content_scope: meta.capture.regex.dart
281+ - match: \)
282+ pop: true
283+ - match: \?(:|=|!)
284+ scope: ignore.capture.regex.dart
285+ - match: \*|\+|\?|\.|\|
286+ scope: keyword.other.regex.dart
287+ - match: \^|\$
288+ scope: keyword.other.regex.dart
150 - match: \.
289 - match: \.
151− scope: punctuation.dot.dart
290+ scope: constant.other.regex.dart
291+ - match: '\[(\^)?'
292+ captures:
293+ 1: keyword.other.negation.regex.dart
294+ push:
295+ - meta_scope: constant.character.range.regex.dart
296+ - match: '\]'
297+ pop: true
298+ - match: '\\[^"'']'
299+ scope: constant.character.escaped.regex.dart
300+ - match: '\{(?:\d+)?,(?:\d+)?\}'
301+ scope: keyword.other.regex.dart
152 string-interp:
302 string-interp:
153− - match: '\$((\w+)|\{([^{}]+)\})'
303+ - match: '(\$)(\{)'
154 captures:
304 captures:
305+ 1: keyword.other.dart
306+ 2: keyword.other.dart
307+ push:
308+ - meta_scope: interpolation.dart
309+ - meta_content_scope: source.dart
310+ - match: '(\})'
311+ captures:
312+ 1: keyword.other.dart
313+ pop: true
314+ - include: main
315+ - match: (\$)(\w+)
316+ captures:
317+ 1: keyword.other.dart
155 2: variable.parameter.dart
318 2: variable.parameter.dart
156− 3: variable.parameter.dart
157 - match: \\.
319 - match: \\.
158 scope: constant.character.escape.dart
320 scope: constant.character.escape.dart
159 strings:
321 strings:
@@ -166,7 +328,7 @@ contexts:
166 - match: (?<!r)'''
328 - match: (?<!r)'''
167 push:
329 push:
168 - meta_scope: string.interpolated.triple.single.dart
330 - meta_scope: string.interpolated.triple.single.dart
169− - match: '''''''(?!'')'
331+ - match: "'''(?!')"
170 pop: true
332 pop: true
171 - include: string-interp
333 - include: string-interp
172 - match: r"""
334 - match: r"""
@@ -177,9 +339,9 @@ contexts:
177 - match: r'''
339 - match: r'''
178 push:
340 push:
179 - meta_scope: string.quoted.triple.single.dart
341 - meta_scope: string.quoted.triple.single.dart
180− - match: '''''''(?!'')'
342+ - match: "'''(?!')"
181 pop: true
343 pop: true
182− - match: (?<!\|r)"
344+ - match: (?<!\\|r)"
183 push:
345 push:
184 - meta_scope: string.interpolated.double.dart
346 - meta_scope: string.interpolated.double.dart
185 - match: '"'
347 - match: '"'
@@ -192,20 +354,16 @@ contexts:
192 - meta_scope: string.quoted.double.dart
354 - meta_scope: string.quoted.double.dart
193 - match: '"'
355 - match: '"'
194 pop: true
356 pop: true
195− - match: \n
357+ - include: regexp
196− scope: invalid.string.newline
197 - match: (?<!\|r)'
358 - match: (?<!\|r)'
198 push:
359 push:
199 - meta_scope: string.interpolated.single.dart
360 - meta_scope: string.interpolated.single.dart
200 - match: "'"
361 - match: "'"
201 pop: true
362 pop: true
202− - match: \n
203− scope: invalid.string.newline
204 - include: string-interp
363 - include: string-interp
205 - match: r'
364 - match: r'
206 push:
365 push:
207 - meta_scope: string.quoted.single.dart
366 - meta_scope: string.quoted.single.dart
208 - match: "'"
367 - match: "'"
209 pop: true
368 pop: true
210− - match: \n
369+ - include: regexp
211− scope: invalid.string.newline
assets/syntaxes/02_Extra/DotENV+1−1

Submodule changed.

assets/syntaxes/02_Extra/DotENV.sublime-syntax+2−4
@@ -4,6 +4,7 @@
4name: DotENV
4name: DotENV
5file_extensions:
5file_extensions:
6 - .env
6 - .env
7+ - .envrc
7 - .env.dist
8 - .env.dist
8 - .env.local
9 - .env.local
9 - .env.sample
10 - .env.sample
@@ -18,11 +19,8 @@ file_extensions:
18 - .env.production
19 - .env.production
19 - .env.production.local
20 - .env.production.local
20 - .env.dusk.local
21 - .env.dusk.local
21− - .env.staging
22− - .env.default
23− - .env.defaults
24− - .envrc
25 - .flaskenv
22 - .flaskenv
23+ - .env.staging
26scope: source.env
24scope: source.env
27contexts:
25contexts:
28 main:
26 main:
assets/syntaxes/02_Extra/Elixir+1−1

Submodule changed.

assets/syntaxes/02_Extra/FSharp+1−1

Submodule changed.

assets/syntaxes/02_Extra/Fish+1−1

Submodule changed.

assets/syntaxes/02_Extra/Fstab.sublime-syntax−1
@@ -5,7 +5,6 @@ name: fstab
5file_extensions:
5file_extensions:
6 - fstab
6 - fstab
7 - crypttab
7 - crypttab
8− - mtab
9scope: source.fstab
8scope: source.fstab
10
9
11contexts:
10contexts:
assets/syntaxes/02_Extra/GLSL+1−1

Submodule changed.

assets/syntaxes/02_Extra/GraphQL+1−1

Submodule changed.

assets/syntaxes/02_Extra/Groffdeleted−1

Submodule changed.

assets/syntaxes/02_Extra/INI.sublime-syntax+2−2
@@ -5,8 +5,8 @@ name: INI
5file_extensions:
5file_extensions:
6 - ini
6 - ini
7 - INI
7 - INI
8− - "inf"
8+ - inf
9− - "INF"
9+ - INF
10 - reg
10 - reg
11 - REG
11 - REG
12 - lng
12 - lng
assets/syntaxes/02_Extra/Julia+1−1

Submodule changed.

assets/syntaxes/02_Extra/LESS+1−1

Submodule changed.

assets/syntaxes/02_Extra/LLVMdeleted−1

Submodule changed.

assets/syntaxes/02_Extra/Leandeleted−1

Submodule changed.

assets/syntaxes/02_Extra/Lean.sublime-syntaxdeleted−125
@@ -1,125 +0,0 @@
1−%YAML 1.2
2−---
3−# http://www.sublimetext.com/docs/3/syntax.html
4−name: Lean
5−file_extensions:
6− - lean
7−scope: source.lean
8−contexts:
9− main:
10− - include: comments
11− - match: '\b(?<!\.)(inductive|coinductive|structure|theorem|axiom|axioms|abbreviation|lemma|definition|def|instance|class|constant)\b\s+(\{[^}]*\})?'
12− captures:
13− 1: keyword.other.definitioncommand.lean
14− push:
15− - meta_scope: meta.definitioncommand.lean
16− - match: '(?=\bwith\b|\bextends\b|[:\|\(\[\{⦃<>])'
17− pop: true
18− - include: comments
19− - include: definitionName
20− - match: ","
21− - match: \b(Prop|Type|Sort)\b
22− scope: storage.type.lean
23− - match: '\battribute\b\s*\[[^\]]*\]'
24− scope: storage.modifier.lean
25− - match: '@\[[^\]]*\]'
26− scope: storage.modifier.lean
27− - match: \b(?<!\.)(private|meta|mutual|protected|noncomputable)\b
28− scope: keyword.control.definition.modifier.lean
29− - match: \b(sorry)\b
30− scope: invalid.illegal.lean
31− - match: '#print\s+(def|definition|inductive|instance|structure|axiom|axioms|class)\b'
32− scope: keyword.other.command.lean
33− - match: '#(print|eval|reduce|check|help|exit|find|where)\b'
34− scope: keyword.other.command.lean
35− - match: \b(?<!\.)(import|export|prelude|theory|definition|def|abbreviation|instance|renaming|hiding|exposing|parameter|parameters|begin|constant|constants|lemma|variable|variables|theorem|example|open|axiom|inductive|coinductive|with|structure|universe|universes|alias|precedence|reserve|postfix|prefix|infix|infixl|infixr|notation|end|using|namespace|section|local|set_option|extends|include|omit|class|classes|instances|raw|run_cmd|restate_axiom)(?!\.)\b
36− scope: keyword.other.lean
37− - match: \b(?<!\.)(calc|have|this|match|do|suffices|show|by|in|at|let|forall|fun|exists|assume|from|obtain|haveI|λ)(?!\.)\b
38− scope: keyword.other.lean
39− - match: «
40− push:
41− - meta_content_scope: entity.name.lean
42− - match: »
43− pop: true
44− - match: \b(?<!\.)(if|then|else)\b
45− scope: keyword.control.lean
46− - match: '"'
47− captures:
48− 0: punctuation.definition.string.begin.lean
49− push:
50− - meta_scope: string.quoted.double.lean
51− - match: '"'
52− captures:
53− 0: punctuation.definition.string.end.lean
54− pop: true
55− - match: '\\[\\"nt'']'
56− scope: constant.character.escape.lean
57− - match: '\\x[0-9A-Fa-f][0-9A-Fa-f]'
58− scope: constant.character.escape.lean
59− - match: '\\u[0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f]'
60− scope: constant.character.escape.lean
61− - match: '''[^\\'']'''
62− scope: string.quoted.single.lean
63− - match: '''(\\(x..|u....|.))'''
64− scope: string.quoted.single.lean
65− captures:
66− 1: constant.character.escape.lean
67− - match: '`+[^\[(]\S+'
68− scope: entity.name.lean
69− - match: '\b([0-9]+|0([xX][0-9a-fA-F]+))\b'
70− scope: constant.numeric.lean
71− blockComment:
72− - match: /-
73− push:
74− - meta_scope: comment.block.lean
75− - match: "-/"
76− pop: true
77− - include: scope:source.lean.markdown
78− - include: blockComment
79− comments:
80− - include: dashComment
81− - include: docComment
82− - include: stringBlock
83− - include: modDocComment
84− - include: blockComment
85− dashComment:
86− - match: (--)
87− captures:
88− 0: punctuation.definition.comment.lean
89− push:
90− - meta_scope: comment.line.double-dash.lean
91− - match: $
92− pop: true
93− - include: scope:source.lean.markdown
94− definitionName:
95− - match: '\b[^:«»\(\)\{\}[:space:]=→λ∀?][^:«»\(\)\{\}[:space:]]*'
96− scope: entity.name.function.lean
97− - match: «
98− push:
99− - meta_content_scope: entity.name.function.lean
100− - match: »
101− pop: true
102− docComment:
103− - match: /--
104− push:
105− - meta_scope: comment.block.documentation.lean
106− - match: "-/"
107− pop: true
108− - include: scope:source.lean.markdown
109− - include: blockComment
110− modDocComment:
111− - match: /-!
112− push:
113− - meta_scope: comment.block.documentation.lean
114− - match: "-/"
115− pop: true
116− - include: scope:source.lean.markdown
117− - include: blockComment
118− stringBlock:
119− - match: /-"
120− push:
121− - meta_scope: comment.block.string.lean
122− - match: '"-/'
123− pop: true
124− - include: scope:source.lean.markdown
125− - include: blockComment
assets/syntaxes/02_Extra/LiveScriptdeleted−1

Submodule changed.

assets/syntaxes/02_Extra/LiveScript.sublime-syntaxdeleted−400
@@ -1,400 +0,0 @@
1−%YAML 1.2
2−---
3−# http://www.sublimetext.com/docs/3/syntax.html
4−name: LiveScript
5−comment: "LiveScript Syntax: version 1"
6−file_extensions:
7− - ls
8− - Slakefile
9− - ls.erb
10−first_line_match: ^#!.*\bls
11−scope: source.livescript
12−contexts:
13− main:
14− - match: |-
15− (?x)
16− !?[~-]{1,2}>\*?
17− |<[~-]{1,2}!?
18− |\(\s* (?= instanceof[\s)]|and[\s)]|or[\s)]|is[\s)]|isnt[\s)]|in[\s)]|import[\s)]|import\ all[\s)] |\.|[-+/*%^&<>=|][\b\s)\w$]|\*\*|\%\%)
19− | (?<=[\s(]instanceof|[\s(]and|[\s(]or|[\s(]is|[\s(]isnt|[\s(]in|[\s(]import|[\s(]import\ all|[\s(]do|\.|\*\*|\%\%|[\b\s(\w$][-+/*%^&<>=|]) \s*\)
20− scope: storage.type.function.livescript
21− - match: \/\*
22− captures:
23− 0: punctuation.definition.comment.livescript
24− push:
25− - meta_scope: comment.block.livescript
26− - match: \*\/
27− captures:
28− 0: punctuation.definition.comment.livescript
29− pop: true
30− - match: '@\w*'
31− scope: storage.type.annotation.livescriptscript
32− - match: '(#)(?!\{).*$\n?'
33− scope: comment.line.number-sign.livescript
34− captures:
35− 1: punctuation.definition.comment.livescript
36− - match: '((?:!|~|!~|~!)?function\*?)\s+([$\w\-]*[$\w]+)'
37− captures:
38− 1: storage.type.function.livescript
39− 2: entity.name.function.livescript
40− - match: (new)\s+(\w+(?:\.\w*)*)
41− captures:
42− 1: keyword.operator.new.livescript
43− 2: entity.name.type.instance.livescript
44− - match: \b(package|private|protected|public|interface|enum|static)(?!-)\b
45− scope: keyword.illegal.livescript
46− - match: "'''"
47− captures:
48− 0: punctuation.definition.string.begin.livescript
49− push:
50− - meta_scope: string.quoted.heredoc.livescript
51− - match: "'''"
52− captures:
53− 0: punctuation.definition.string.end.livescript
54− pop: true
55− - match: '"""'
56− captures:
57− 0: punctuation.definition.string.begin.livescript
58− push:
59− - meta_scope: string.quoted.double.heredoc.livescript
60− - match: '"""'
61− captures:
62− 0: punctuation.definition.string.end.livescript
63− pop: true
64− - match: \\.
65− scope: constant.character.escape.livescript
66− - include: interpolated_livescript
67− - match: "``"
68− captures:
69− 0: punctuation.definition.string.begin.livescript
70− push:
71− - meta_scope: string.quoted.script.livescript
72− - match: "``"
73− captures:
74− 0: punctuation.definition.string.end.livescript
75− pop: true
76− - match: '\\(x[0-9A-Fa-f]{2}|[0-2][0-7]{0,2}|3[0-6][0-7]|37[0-7]?|[4-7][0-7]?|.)'
77− scope: constant.character.escape.livescript
78− - match: '<\['
79− push:
80− - meta_scope: string.array-literal.livescript
81− - match: '\]>'
82− pop: true
83− - match: '/{2}(?![\s=/*+{}?]).*?[^\\]/[igmy]{0,4}(?![a-zA-Z0-9])/{2}'
84− scope: string.regexp.livescript
85− - match: '/{2}\n'
86− push:
87− - meta_scope: string.regexp.livescript
88− - match: "/{2}[imgy]{0,4}"
89− pop: true
90− - include: embedded_spaced_comment
91− - include: interpolated_livescript
92− - match: "/{2}"
93− push:
94− - meta_scope: string.regexp.livescript
95− - match: "/{2}[imgy]{0,4}"
96− pop: true
97− - match: '\\(x[0-9A-Fa-f]{2}|[0-2][0-7]{0,2}|3[0-6][0-7]|37[0-7]?|[4-7][0-7]?|.)'
98− scope: constant.character.escape.livescript
99− - include: interpolated_livescript
100− - match: '/(?![\s=/*+{}?]).*?[^\\]/[igmy]{0,4}(?![a-zA-Z0-9])'
101− scope: string.regexp.livescript
102− - match: |-
103− (?x)
104− \b(?<![\.\$\-@])(
105− instanceof|new|delete|typeof|and|or|is|isnt|not
106− )(?!\-|\s*:)\b
107− scope: keyword.operator.livescript
108− - match: <\||\|>
109− scope: keyword.operator.livescript
110− - match: "=>"
111− scope: keyword.control.livescript
112− - match: |-
113− (?x)
114− \b(?<![\.\$\-@])(?:
115− return|break|continue|throw
116− |try|if|while|for|for\s+own|switch|unless|until
117− |catch|finally|else|nobreak|case|default|fallthrough|when|otherwise|then
118− |yield
119− )(?!\-|\s*:)\b
120− scope: keyword.control.livescript
121− - match: |-
122− (?x)
123− and=|or=|%|&|\^|\*|\/|(?<![a-zA-Z$_])(\-)?\-(?!\-?>)|\+\+|\+|
124− ~(?!~?>)|==|=|!=|<=|>=|<<=|>>=|
125− >>>=|<>|<(?!\[)|(?<!\])>|(?<!\w)!(?!([~\-]+)?>)|&&|\.\.(\.)?|\s\.\s|\?|\|\||\:|\*=|(?<!\()/=|%=|\+=|\-=|\.=|&=
126− |\^=
127− scope: keyword.operator.livescript
128− - match: |-
129− (?x)
130− \b(?<![\.\$\-@])(?:
131− function
132− )(?!\-|\s*:)\b
133− scope: storage.type.function.livescript
134− - match: |-
135− (?x)
136− \b(?<![\.\$\-@])(?:
137− this|throw|then|try|typeof!?|til|to
138− |continue|const|case|catch|class
139− |in|instanceof|import|import\s+all|implements|if|is
140− |default|delete|debugger|do
141− |for|for\s+own|finally|function|from|fallthrough
142− |super|switch
143− |else|nobreak|extends|export|eval
144− |and|arguments
145− |new|not
146− |unless|until
147− |while|with|when
148− |of|or|otherwise
149− |let|var|loop
150− |match
151− |by|yield
152− )(?!\-|\s*:)\b
153− scope: keyword.other.livescript
154− - match: '([a-zA-Z\$_](?:[\w$.-])*)\s*(?!\::)((:)|(=(?!>)))\s*(?!(\s*!?\s*\(.*\))?\s*(!?[~-]{1,2}>\*?))'
155− captures:
156− 1: variable.assignment.livescript
157− 3: punctuation.separator.key-value, keyword.operator.livescript
158− 4: keyword.operator.livescript
159− - match: '(?<=\s|^)([\[\{])(?=.*?[\]\}]\s+[:=])'
160− captures:
161− 0: keyword.operator.livescript
162− push:
163− - meta_scope: meta.variable.assignment.destructured.livescript
164− - match: '([\]\}]\s*[:=])'
165− captures:
166− 0: keyword.operator.livescript
167− pop: true
168− - include: variable_name
169− - include: instance_variable
170− - include: single_quoted_string
171− - include: double_quoted_string
172− - include: numeric
173− - match: |-
174− (?x)
175− (\s*)
176− (?=[a-zA-Z\$_])
177− ([a-zA-Z\$_]([\w$.:-])*)\s*
178− (?=[:=](\s*!?\s*\(.*\))?\s*(!?[~-]{1,2}>\*?))
179− scope: meta.function.livescript
180− captures:
181− 2: entity.name.function.livescript
182− 3: entity.name.function.livescript
183− 4: variable.parameter.function.livescript
184− 5: storage.type.function.livescript
185− - match: \b(?<!\.)(true|on|yes)(?!\s*:)\b
186− scope: constant.language.boolean.true.livescript
187− - match: \b(?<!\.)(false|off|no)(?!\s*:)\b
188− scope: constant.language.boolean.false.livescript
189− - match: \b(?<!\.)(null|void)(?!\s*:)\b
190− scope: constant.language.null.livescript
191− - match: \b(?<!\.)(super|this|extends)(?!\s*:)\b
192− scope: variable.language.livescript
193− - match: '(class\b)\s+(@?[a-zA-Z$_][\w$.-]*)?(?:\s+(extends)\s+(@?[a-zA-Z$_][\w$.-]*))?'
194− scope: meta.class.livescript
195− captures:
196− 1: storage.type.class.livescript
197− 2: entity.name.type.class.livescript
198− 3: keyword.control.inheritance.livescript
199− 4: entity.other.inherited-class.livescript
200− - match: \b(debugger|\\)\b
201− scope: keyword.other.livescript
202− - match: |-
203− (?x)\b(
204− Array|ArrayBuffer|Blob|Boolean|Date|document|event|Function|
205− Int(8|16|32|64)Array|Math|Map|Number|
206− Object|Proxy|RegExp|Set|String|WeakMap|
207− window|Uint(8|16|32|64)Array|XMLHttpRequest
208− )\b
209− scope: support.class.livescript
210− - match: \b(console)\b
211− scope: entity.name.type.object.livescript
212− - match: \b(Infinity|NaN|undefined)\b
213− scope: constant.language.livescript
214− - match: \;
215− scope: punctuation.terminator.statement.livescript
216− - match: ',[ |\t]*'
217− scope: meta.delimiter.object.comma.livescript
218− - match: \.
219− scope: meta.delimiter.method.period.livescript
220− - match: '\{|\}'
221− scope: meta.brace.curly.livescript
222− - match: \(|\)
223− scope: meta.brace.round.livescript
224− - match: '\[|\]\s*'
225− scope: meta.brace.square.livescript
226− - include: instance_variable
227− - include: backslash_string
228− - include: single_quoted_string
229− - include: double_quoted_string
230− - include: numeric
231− - match: '()(@|@@|[$\w\-]*[$\w]+)\s*(`)'
232− captures:
233− 1: keyword.operator.livescript
234− 2: meta.function-call.livescript
235− 3: keyword.operator.livescript
236− - match: "`"
237− scope: keyword.operator.livescript
238− - match: '()(@|@@|[$\w\-]*[$\w]+)(?:(\??\!)|[(])'
239− captures:
240− 1: keyword.operator.livescript
241− 2: meta.function-call.livescript
242− 3: keyword.operator.livescript
243− - match: '(@|@@|[$\w\-]*[$\w]+)(\?)? (?!\s*(((by|of|and|or|with|when|unless|if|is|isnt|else|nobreak|for|from|not in|in|catch|til|to|then|import|extends|implements|instanceof)\b)|[=:.*\/+\-%\^<>][ =)]|[`}%*)]|/(?!.*?/)|&&|[.][^.]|=>|\/ +|\||\|\||\-\-|\+\+|\|>|<|\||$|\n|\#|/\*))'
244− captures:
245− 1: meta.function-call.livescript
246− 2: keyword.operator.livescript
247− - match: \| _
248− scope: keyword.control.livescript
249− - match: '\|(?![.])'
250− scope: keyword.control.livescript
251− - match: \|
252− scope: keyword.operator.livescript
253− - match: ((?<=console\.)(debug|warn|info|log|error|time(End|-end)|assert))\b
254− scope: support.function.console.livescript
255− - match: |-
256− (?x)\b(
257− decodeURI(Component)?|encodeURI(Component)?|eval|parse(Float|Int)|require
258− )\b
259− scope: support.function.livescript
260− - match: |-
261− (?x)(?<![.-])\b(
262− map|filter|reject|partition|find|each|head|tail|last|initial|empty|
263− values|keys|length|cons|append|join|reverse|fold(l|r)?1?|unfoldr|
264− and(List|-list)|or(List|-list)|any|all|unique|sum|product|mean|compact|
265− concat(Map|-map)?|maximum|minimum|scan(l|r)?1?|replicate|slice|apply|
266− split(At|-at)?|take(While|-while)?|drop(While|-while)?|span|first|
267− break(It|-it)|list(ToObj|-to-obj)|obj(ToFunc|-to-func)|
268− pairs(ToObj|-to-obj)|obj(ToPairs|-to-pairs|ToLists|-to-lists)|
269− zip(All|-all)?(With|-with)?|compose|curry|partial|flip|fix|
270− sort(With|-with|By|-by)?|group(By|-by)|break(List|-list|Str|-str)|
271− difference|intersection|union|average|flatten|chars|unchars|repeat|
272− lines|unlines|words|unwords|max|min|negate|abs|signum|quot|rem|div|mod|
273− recip|pi|tau|exp|sqrt|ln|pow|sin|cos|tan|asin|acos|atan|atan2|truncate|
274− round|ceiling|floor|is(It|-it)NaN|even|odd|gcd|lcm|disabled__id
275− )\b(?![.-])
276− comment: |
277− Generated by DOM query from http://gkz.github.com/prelude-ls/:
278− [].slice
279− .call(document.querySelectorAll(".nav-pills li a"))
280− .map(function(_) {return _.innerText})
281− .filter(function(_) {return _.trim() !== '})
282− .slice(2)
283− .join("|")
284− scope: support.function.prelude.livescript
285− - match: '(?x)(?<![.-])\b(that|it|e|_)\b'
286− scope: support.function.semireserved.livescript
287− - match: |-
288− (?x)((?<=(\.|\]|\)))(
289− apply|call|concat|every|filter|for(Each|-each)|
290− from|has(Own|-own)(Property|-property)|index(Of|-of)|
291− is(Prototype|-prototype)(Of|-of)|join|last(Index|-index)(Of|-of)|
292− map|of|pop|property(Is|-is)(Enumerable|-enumerable)|push|
293− reduce(Right|-right)?|reverse|shift|slice|some|sort|
294− splice|to(Locale|-locale)?(String|-string)|unshift|valueOf
295− ))\b(?!-)
296− scope: support.function.method.array.livescript
297− - match: |-
298− (?x)((?<=Array\.)(
299− isArray
300− ))\b
301− scope: support.function.static.array.livescript
302− - match: |-
303− (?x)((?<=Object\.)(
304− create|define(Propert|-propert)(ies|y)|freeze|
305− get(Own|-own)(Property|-property)(Descriptors?|Names)|
306− get(Property|-property)(Descriptor|Names)|getPrototypeOf|
307− is((Extensible|-extensible)|(Frozen|-frozen)|(Sealed|-sealed))?|
308− keys|prevent(Extensions|-extensions)|seal
309− ))\b
310− scope: support.function.static.object.livescript
311− - match: |-
312− (?x)((?<=Math\.)(
313− abs|acos|acosh|asin|asinh|atan|atan2|atanh|ceil|cos|cosh|exp|expm1|floor|
314− hypot|log|log10|log1p|log2|max|min|pow|random|round|sign|sin|sinh|sqrt|
315− tan|tanh|trunc
316− ))\b
317− scope: support.function.static.math.livescript
318− - match: |-
319− (?x)((?<=Number\.)(
320− is(Finite|Integer|NaN)|to(Integer|-integer)
321− ))\b
322− scope: support.function.static.number.livescript
323− - match: '[\$\w][\w-]*'
324− scope: variable.other.livescript
325− backslash_string:
326− - match: '\\([\\)\s,\};\]])?'
327− captures:
328− 0: string.quoted.single.livescript
329− push:
330− - meta_content_scope: string.quoted.single.livescript
331− - match: '([\\)\s,\};\]])'
332− captures:
333− 0: punctuation.definition.string.end.livescript
334− pop: true
335− constructor_variable:
336− - match: '([a-zA-Z$_][\w$-]*)(@{2})([a-zA-Z$_][\w$-]*)?'
337− scope: variable.other.readwrite.constructor.livescript
338− double_quoted_string:
339− - match: '"'
340− captures:
341− 0: punctuation.definition.string.begin.livescript
342− push:
343− - meta_scope: string.quoted.double.livescript
344− - match: '"'
345− captures:
346− 0: punctuation.definition.string.end.livescript
347− pop: true
348− - match: '\\(x[0-9A-Fa-f]{2}|[0-2][0-7]{0,2}|3[0-6][0-7]|37[0-7]?|[4-7][0-7]?|.)'
349− scope: constant.character.escape.livescript
350− - include: interpolated_livescript
351− embedded_comment:
352− - match: (?<!\\)(#).*$\n
353− scope: comment.line.number-sign.livescript
354− captures:
355− 1: punctuation.definition.comment.livescript
356− embedded_spaced_comment:
357− - match: (?<!\\)(#\s).*$\n
358− scope: comment.line.number-sign.livescript
359− captures:
360− 1: punctuation.definition.comment.livescript
361− instance_variable:
362− - match: '(?<![$\w\-])(@)'
363− scope: variable.other.readwrite.instance.livescript
364− interpolated_livescript:
365− - match: '\#\{'
366− captures:
367− 0: punctuation.section.embedded.livescript
368− push:
369− - meta_scope: source.livescript.embedded.source
370− - match: '\}'
371− captures:
372− 0: punctuation.section.embedded.livescript
373− pop: true
374− - include: main
375− - match: '\#'
376− push:
377− - meta_scope: source.livescript.embedded.source.simple
378− - match: ""
379− pop: true
380− - include: main
381− numeric:
382− - match: '(?<![\$@a-zA-Z_])(([0-9]+r[0-9_]+)|((16r|0[xX])[0-9a-fA-F_]+)|([0-9]+(\.[0-9]+[0-9_]*)?(e[+\-]?[0-9_]+)?)[_a-zA-Z0-9]*)'
383− scope: constant.numeric.livescript
384− single_quoted_string:
385− - match: "'"
386− captures:
387− 0: punctuation.definition.string.begin.livescript
388− push:
389− - meta_scope: string.quoted.single.livescript
390− - match: "'"
391− captures:
392− 0: punctuation.definition.string.end.livescript
393− pop: true
394− - match: '\\(x[0-9A-Fa-f]{2}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)'
395− scope: constant.character.escape.livescript
396− variable_name:
397− - match: '([a-zA-Z\$_][\w$-]*(\.\w+)*)(?!\-)'
398− scope: variable.assignment.livescript
399− captures:
400− 1: variable.assignment.livescript
assets/syntaxes/02_Extra/Manpage.sublime-syntax+26−144
@@ -7,165 +7,47 @@ file_extensions:
7scope: source.man
7scope: source.man
8
8
9variables:
9variables:
10− section_heading: '^(?!#)\S.*$'
10+ section_heading: '^\S.*$'
11− command_line_option: '(--?[A-Za-z0-9][_A-Za-z0-9-]*)'
12
11
13contexts:
12contexts:
14− prototype:
15− # ignore syntax test lines
16− - match: '^#'
17− push:
18− - meta_scope: comment.syntax-test.man
19− - match: $\n?
20− pop: true
21 main:
13 main:
22 - match: ^
14 - match: ^
23 push: first_line
15 push: first_line
24
16
25 first_line:
17 first_line:
26− - match: '([A-Z0-9_\-]+)(\()([^)]+)(\))\s*'
18+ - match: '([A-Z0-9_\-]+)(\()([^)]+)(\))'
27 captures:
19 captures:
28− 1: meta.preprocessor.man
20+ 1: meta.preprocessor
29− 2: keyword.operator.man
21+ 2: keyword.operator
30− 3: string.quoted.other.man
22+ 3: string.quoted.other
31− 4: keyword.operator.man
23+ 4: keyword.operator
32− push:
33− - match: (?:[\w'-]+|\s(?!\s))
34− scope: markup.heading.title.man
35− - match: \s\s
36− pop: true
37− - match: '(?=\S|$)'
38− pop: true
39
24
40 - match: '$'
25 - match: '$'
41− set: body
26+ push: body
42
27
43 body:
28 body:
44− # English, ..., ..., ..., Russian, ...
45−
46− - match: '^(?:SYNOPSIS|SYNTAX|SINTASSI|SKŁADNIA|СИНТАКСИС|書式)'
29+ - match: '^(SYNOPSIS|SYNTAX|SINTASSI|SKŁADNIA|СИНТАКСИС|書式)'
47− scope: markup.heading.synopsis.man
30+ push: Packages/C/C.sublime-syntax
48− embed: synopsis
49− escape: '(?={{section_heading}})'
50−
51− - match: '^(?:USAGE)'
52− scope: markup.heading.synopsis.man
31+ scope: markup.heading
53− embed: synopsis
32+ with_prototype:
54− escape: '(?={{section_heading}})'
33+ - match: '(?={{section_heading}})'
55−
34+ pop: true
56− - match: '{{section_heading}}'
57− scope: markup.heading.other.man
58− embed: options # some man pages put command line options under the description heading
59− escape: '(?={{section_heading}})'
60
35
61− function-call:
36+ - match: '^\S.*$'
62− - match: '\b([A-Za-z0-9_\-]+\.)?([A-Za-z0-9_\-]+)(\()([^)]*)(\))'
37+ scope: markup.heading
63− captures:
64− 1: entity.name.function.man
65− 2: entity.name.function.man
66− 3: keyword.operator.man
67− 4: constant.numeric.man
68− 5: keyword.operator.man
69
38
70− env-var:
71− - match: '(\$)(?!\d)(\w+)\b'
39+ - match: '\b([A-Za-z0-9_\-]+)(\()([^)]*)(\))'
72 captures:
40 captures:
73− 1: punctuation.definition.variable.man
41+ 1: entity.name.function
42+ 2: keyword.operator
74− 2: constant.other.man
43+ 3: constant.numeric
44+ 4: keyword.operator
75
45
76− options:
77 # command-line options like --option=value, --some-flag, or -x
46 # command-line options like --option=value, --some-flag, or -x
78− - match: '^[ ]{7}(?=-)'
47+ - match: '(?:[^a-zA-Z0-9_-]|^|\s)(--?[A-Za-z0-9][A-Za-z0-9-]*)(?:(=)?("?)([A-Za-z0-9]+)("?))?'
79− push: expect-command-line-option
80− - match: '(?:[^a-zA-Z0-9_-]|^|\s){{command_line_option}}'
81− captures:
82− 1: entity.name.command-line-option
83− push:
84− - match: '='
85− scope: keyword.operator.man
86− set:
87− - match: '[^],.() ]+'
88− scope: variable.parameter.man
89− pop: true
90− - match: $
91− pop: true
92− - match: ''
93− pop: true
94− - include: function-call
95− - include: c-code
96− - include: env-var
97−
98− expect-command-line-option:
99− - match: '[A-Za-z0-9-]+'
100− scope: entity.name.command-line-option.man
101− - match: '(\[)(=)'
102− captures:
103− 1: punctuation.section.brackets.begin.man
104− 2: keyword.operator.man
105− push: [command-line-option-or-pipe, expect-parameter]
106− - match: '\['
107− push:
108− - meta_scope: entity.name.command-line-option.man
109− - match: '\]'
110− pop: true
111− - match: '='
112− scope: keyword.operator.man
113− push: expect-parameter
114− - match: (?=.*\.)
115− pop: true
116− - match: '\s'
117− push: expect-parameter
118− - match: '(,)\s*'
119− captures:
120− 1: punctuation.separator.man
121− - match: $|(?=\])
122− pop: true
123−
124− expect-parameter:
125− - match: '[A-Za-z0-9-]+'
126− scope: variable.parameter.man
127− - match: (?=\s+\|)
128− pop: true
129− - match: \|
130− scope: keyword.operator.logical.man
131− - match: '\['
132− scope: punctuation.section.brackets.begin.man
133− push:
134− - match: '\]'
135− scope: punctuation.section.brackets.end.man
136− pop: true
137− - include: expect-parameter
138− - match: '$|(?=[],]|{{command_line_option}})'
139− pop: true
140−
141− c-code:
142− - match: '^(?=\s+(?:#include\b|#define\b|/\*|struct\s+(\w+\s*)?\{))'
143− embed: scope:source.c
144− #embed_scope: source.c.embedded.man
145− #escape: ^(?!#|\1|\s*(?:$|/\*|#include\b|#define\b))
146− escape: ^(?=\s*(?:\(.*\.\)\s*$|[A-Z](?![A-Z])))
147−
148− synopsis:
149− - include: c-code
150− - match: \[
151− scope: punctuation.section.brackets.begin.man
152− push: command-line-option-or-pipe
153− - include: options
154−
155− command-line-option-or-pipe:
156− - match: (\|)\s*
157 captures:
48 captures:
49+ 1: entity.name
158− 1: keyword.operator.logical.man
50+ 2: keyword.operator
159− #- match: (?={{command_line_option}})
51+ 3: punctuation.definition.string.begin
160− - match: \w+-\w+
52+ 4: variable.parameter
161− - match: (?=-)
162− push:
163− - match: (?=\s*\|)
164− pop: true
165− - include: expect-command-line-option
166− - match: \]
167− scope: punctuation.section.brackets.end.man
53+ 3: punctuation.definition.string.end
168− pop: true
169− - match: \[
170− scope: punctuation.section.brackets.begin.man
171− push: command-line-option-or-pipe
assets/syntaxes/02_Extra/MediaWikideleted−1

Submodule changed.

assets/syntaxes/02_Extra/Nginx+1−1

Submodule changed.

assets/syntaxes/02_Extra/Nim.sublime-syntax−1
@@ -5,7 +5,6 @@ name: Nim
5file_extensions:
5file_extensions:
6 - nim
6 - nim
7 - nims
7 - nims
8− - nimble
9scope: source.nim
8scope: source.nim
10contexts:
9contexts:
11 main:
10 main:
assets/syntaxes/02_Extra/Ninjadeleted−1

Submodule changed.

assets/syntaxes/02_Extra/Ninja.sublime-syntaxdeleted−52
@@ -1,52 +0,0 @@
1−%YAML 1.2
2−---
3−# http://www.sublimetext.com/docs/3/syntax.html
4−name: Ninja
5−file_extensions:
6− - ninja
7−scope: source.ninja
8−contexts:
9− main:
10− - match: (#).*$\n?
11− comment: Comment line.
12− scope: comment.line.number-sign.ninja
13− captures:
14− 1: punctuation.definition.comment.ninja
15− - match: ^(rule)\b
16− comment: Rule keyword and keywords for a rule.
17− captures:
18− 1: keyword.other.ninja
19− push:
20− - match: ^(?=\S)
21− pop: true
22− - include: main
23− - match: \b(?:command|deps|depfile|description|generator|pool|restat|rspfile|rspfile_content)\b
24− scope: keyword.other.ninja
25− - match: ^(pool)\b
26− comment: Pool keyword and keywords for a pool.
27− captures:
28− 1: keyword.other.ninja
29− push:
30− - match: ^(?=\S)
31− pop: true
32− - include: main
33− - match: \b(?:depth)\b
34− scope: keyword.other.ninja
35− - match: ^(?:build|rule|default|include|subninja)\b
36− comment: Other Keywords.
37− scope: keyword.other.ninja
38− - match: '(?:[=:]|\|{1,2})(?=\s)'
39− comment: Operators for variable assignment (=), rule definition (:), implicit (|) and order only (||) dependencies.
40− scope: keyword.operator.ninja
41− - match: \$$
42− comment: Line wrap.
43− scope: keyword.operator.ninja
44− - match: \$\$
45− comment: Dollar literal.
46− scope: keyword.operator.ninja
47− - match: '\$[[:alnum:]_-]+'
48− comment: Simple variables, e.g. $var.
49− scope: variable.other.ninja
50− - match: '\${[[:alnum:]_.-]+}'
51− comment: "Variables, e.g. ${some.var.name}."
52− scope: variable.other.ninja
assets/syntaxes/02_Extra/PowerShell+1−1

Submodule changed.

assets/syntaxes/02_Extra/PowerShell.sublime-syntax+48−58
@@ -24,7 +24,7 @@ contexts:
24 - include: commands
24 - include: commands
25 - include: commentLine
25 - include: commentLine
26 - include: variable
26 - include: variable
27− - include: subexpression
27+ - include: interpolatedStringContent
28 - include: function
28 - include: function
29 - include: attribute
29 - include: attribute
30 - include: UsingDirective
30 - include: UsingDirective
@@ -33,38 +33,32 @@ contexts:
33 - include: doubleQuotedString
33 - include: doubleQuotedString
34 - include: scriptblock
34 - include: scriptblock
35 - include: doubleQuotedStringEscapes
35 - include: doubleQuotedStringEscapes
36− - match: '[''\x{2018}-\x{201B}]'
36+ - match: (?<!')'
37 captures:
37 captures:
38 0: punctuation.definition.string.begin.powershell
38 0: punctuation.definition.string.begin.powershell
39 push:
39 push:
40 - meta_scope: string.quoted.single.powershell
40 - meta_scope: string.quoted.single.powershell
41− - match: '[''\x{2018}-\x{201B}]{2}'
41+ - match: "'(?!')"
42− scope: constant.character.escape.powershell
43− - match: '[''\x{2018}-\x{201B}]'
44 captures:
42 captures:
45 0: punctuation.definition.string.end.powershell
43 0: punctuation.definition.string.end.powershell
46 pop: true
44 pop: true
45+ - match: "''"
46+ scope: constant.character.escape.powershell
47− - match: '(@["\x{201C}-\x{201E}])\s*$'
47+ - match: \@"(?=$)
48− captures:
49− 1: punctuation.definition.string.begin.powershell
50 push:
48 push:
51 - meta_scope: string.quoted.double.heredoc.powershell
49 - meta_scope: string.quoted.double.heredoc.powershell
52− - match: '^["\x{201C}-\x{201E}]@'
50+ - match: ^"@
53− captures:
54− 0: punctuation.definition.string.end.powershell
55 pop: true
51 pop: true
56 - include: variableNoProperty
52 - include: variableNoProperty
57 - include: doubleQuotedStringEscapes
53 - include: doubleQuotedStringEscapes
58 - include: interpolation
54 - include: interpolation
59− - match: '(@[''\x{2018}-\x{201B}])\s*$'
55+ - match: \@'(?=$)
60− captures:
61− 1: punctuation.definition.string.begin.powershell
62 push:
56 push:
63 - meta_scope: string.quoted.single.heredoc.powershell
57 - meta_scope: string.quoted.single.heredoc.powershell
64− - match: '^[''\x{2018}-\x{201B}]@'
58+ - match: ^'@
65− captures:
66− 0: punctuation.definition.string.end.powershell
67 pop: true
59 pop: true
60+ - match: "''"
61+ scope: constant.character.escape.powershell
68 - include: numericConstant
62 - include: numericConstant
69 - match: (@)(\()
63 - match: (@)(\()
70 captures:
64 captures:
@@ -77,12 +71,11 @@ contexts:
77 0: punctuation.section.group.end.powershell
71 0: punctuation.section.group.end.powershell
78 pop: true
72 pop: true
79 - include: main
73 - include: main
80− - match: ((\$))(\()
74+ - match: (\$)(\()
81 comment: "TODO: move to repo; make recursive."
75 comment: "TODO: move to repo; make recursive."
82 captures:
76 captures:
83− 1: keyword.other.substatement.powershell
84− 2: punctuation.definition.subexpression.powershell
77+ 1: punctuation.definition.variable.powershell
85− 3: punctuation.section.group.begin.powershell
78+ 2: punctuation.section.group.begin.powershell
86 push:
79 push:
87 - meta_scope: meta.group.complex.subexpression.powershell
80 - meta_scope: meta.group.complex.subexpression.powershell
88 - match: \)
81 - match: \)
@@ -92,7 +85,7 @@ contexts:
92 - include: main
85 - include: main
93 - match: '(\b(([A-Za-z0-9\-_\.]+)\.(?i:exe|com|cmd|bat))\b)'
86 - match: '(\b(([A-Za-z0-9\-_\.]+)\.(?i:exe|com|cmd|bat))\b)'
94 scope: support.function.powershell
87 scope: support.function.powershell
95− - match: (?<!\w|-|\.)((?i:begin|break|catch|clean|continue|data|default|define|do|dynamicparam|else|elseif|end|exit|finally|for|from|if|in|inlinescript|parallel|param|process|return|sequence|switch|throw|trap|try|until|var|while)|%|\?)(?!\w)
88+ - match: (?<!\w|-|\.)((?i:begin|break|catch|continue|data|default|define|do|dynamicparam|else|elseif|end|exit|finally|for|from|if|in|inlinescript|parallel|param|process|return|sequence|switch|throw|trap|try|until|var|while)|%|\?)(?!\w)
96 scope: keyword.control.powershell
89 scope: keyword.control.powershell
97 - match: '(?<!\w|-|[^\)]\.)((?i:(foreach|where)(?!-object))|%|\?)(?!\w)'
90 - match: '(?<!\w|-|[^\)]\.)((?i:(foreach|where)(?!-object))|%|\?)(?!\w)'
98 scope: keyword.control.powershell
91 scope: keyword.control.powershell
@@ -142,7 +135,7 @@ contexts:
142 - meta_scope: meta.requires.powershell
135 - meta_scope: meta.requires.powershell
143 - match: $
136 - match: $
144 pop: true
137 pop: true
145− - match: \-(?i:Modules|PSSnapin|RunAsAdministrator|ShellId|Version|Assembly|PSEdition)
138+ - match: \-(?i:Modules|PSSnapin|RunAsAdministrator|ShellId|Version)
146 scope: keyword.other.powershell
139 scope: keyword.other.powershell
147 - match: '(?<!-)\b\p{L}+|\d+(?:\.\d+)*'
140 - match: '(?<!-)\b\p{L}+|\d+(?:\.\d+)*'
148 scope: variable.parameter.powershell
141 scope: variable.parameter.powershell
@@ -194,53 +187,51 @@ contexts:
194 comment: Builtin cmdlets with reserved verbs
187 comment: Builtin cmdlets with reserved verbs
195 scope: support.function.powershell
188 scope: support.function.powershell
196 commentEmbeddedDocs:
189 commentEmbeddedDocs:
197− - match: (?:^|\G)(?i:\s*(\.)(COMPONENT|DESCRIPTION|EXAMPLE|FUNCTIONALITY|INPUTS|LINK|NOTES|OUTPUTS|ROLE|SYNOPSIS))\s*$
190+ - match: ^(?i:(?:\s?|#)+(\.)(COMPONENT|DESCRIPTION|EXAMPLE|EXTERNALHELP|FORWARDHELPCATEGORY|FORWARDHELPTARGETNAME|FUNCTIONALITY|INPUTS|LINK|NOTES|OUTPUTS|REMOTEHELPRUNSPACE|ROLE|SYNOPSIS))
198− comment: these embedded doc keywords do not support arguments, must be the only thing on the line
199 scope: comment.documentation.embedded.powershell
191 scope: comment.documentation.embedded.powershell
200 captures:
192 captures:
201 1: constant.string.documentation.powershell
193 1: constant.string.documentation.powershell
202 2: keyword.operator.documentation.powershell
194 2: keyword.operator.documentation.powershell
203− - match: (?:^|\G)(?i:\s*(\.)(EXTERNALHELP|FORWARDHELP(?:CATEGORY|TARGETNAME)|PARAMETER|REMOTEHELPRUNSPACE))\s+(.+?)\s*$
195+ - match: '(?i:\s?(\.)(PARAMETER|FORWARDHELPTARGETNAME|FORWARDHELPCATEGORY|REMOTEHELPRUNSPACE|EXTERNALHELP)\s+([a-z0-9-_]+))'
204− comment: these embedded doc keywords require arguments though the type required may be inconsistent, they may not all be able to use the same argument match
205 scope: comment.documentation.embedded.powershell
196 scope: comment.documentation.embedded.powershell
206 captures:
197 captures:
207 1: constant.string.documentation.powershell
198 1: constant.string.documentation.powershell
208 2: keyword.operator.documentation.powershell
199 2: keyword.operator.documentation.powershell
209 3: keyword.operator.documentation.powershell
200 3: keyword.operator.documentation.powershell
210 commentLine:
201 commentLine:
211− - match: '(?<![`\\-])(#)#*'
202+ - match: '(?<![`\\-])#'
212 captures:
203 captures:
213− 1: punctuation.definition.comment.powershell
204+ 0: punctuation.definition.comment.powershell
214 push:
205 push:
215 - meta_scope: comment.line.powershell
206 - meta_scope: comment.line.powershell
216 - match: $\n?
207 - match: $\n?
217 captures:
208 captures:
218− 1: punctuation.definition.comment.powershell
209+ 0: punctuation.definition.comment.powershell
219 pop: true
210 pop: true
220 - include: commentEmbeddedDocs
211 - include: commentEmbeddedDocs
221 - include: RequiresDirective
212 - include: RequiresDirective
222 doubleQuotedString:
213 doubleQuotedString:
223− - match: '["\x{201C}-\x{201E}]'
214+ - match: (?<!(?<!`)")"
224 captures:
215 captures:
225 0: punctuation.definition.string.begin.powershell
216 0: punctuation.definition.string.begin.powershell
226 push:
217 push:
227 - meta_scope: string.quoted.double.powershell
218 - meta_scope: string.quoted.double.powershell
219+ - match: '"(?!")'
220+ captures:
221+ 0: punctuation.definition.string.end.powershell
222+ pop: true
228 - match: '(?i)\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,64}\b'
223 - match: '(?i)\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,64}\b'
229 - include: variableNoProperty
224 - include: variableNoProperty
230 - include: doubleQuotedStringEscapes
225 - include: doubleQuotedStringEscapes
231− - match: '["\x{201C}-\x{201E}]{2}'
232− scope: constant.character.escape.powershell
233 - include: interpolation
226 - include: interpolation
234 - match: '`\s*$'
227 - match: '`\s*$'
235 scope: keyword.other.powershell
228 scope: keyword.other.powershell
236− - match: '["\x{201C}-\x{201E}]'
237− captures:
238− 0: punctuation.definition.string.end.powershell
239− pop: true
240 doubleQuotedStringEscapes:
229 doubleQuotedStringEscapes:
241− - match: '`[`0abefnrtv''"\x{2018}-\x{201E}$]'
230+ - match: '`[`0abefnrtv"''$]'
242 scope: constant.character.escape.powershell
231 scope: constant.character.escape.powershell
243 - include: unicodeEscape
232 - include: unicodeEscape
233+ - match: '""'
234+ scope: constant.character.escape.powershell
244 function:
235 function:
245 - match: '^(?:\s*+)(?i)(function|filter|configuration|workflow)\s+(?:(global|local|script|private):)?((?:\p{L}|\d|_|-|\.)+)'
236 - match: '^(?:\s*+)(?i)(function|filter|configuration|workflow)\s+(?:(global|local|script|private):)?((?:\p{L}|\d|_|-|\.)+)'
246 captures:
237 captures:
@@ -272,23 +263,33 @@ contexts:
272 4: keyword.operator.assignment.powershell
263 4: keyword.operator.assignment.powershell
273 - include: scriptblock
264 - include: scriptblock
274 - include: main
265 - include: main
266+ interpolatedStringContent:
267+ - match: \(
268+ captures:
269+ 0: punctuation.section.group.begin.powershell
270+ push:
271+ - meta_content_scope: interpolated.simple.source.powershell
272+ - match: \)
273+ captures:
274+ 0: punctuation.section.group.end.powershell
275+ pop: true
276+ - include: main
277+ - include: interpolation
278+ - include: interpolatedStringContent
275 interpolation:
279 interpolation:
276− - match: (((\$)))((\())
280+ - match: (\$)(\()
277 captures:
281 captures:
278− 1: keyword.other.substatement.powershell
279− 2: punctuation.definition.substatement.powershell
282+ 1: punctuation.definition.variable.powershell
280− 3: punctuation.section.embedded.substatement.begin.powershell
281− 4: punctuation.section.group.begin.powershell
283+ 2: punctuation.section.group.begin.powershell
282− 5: punctuation.section.embedded.substatement.begin.powershell
283 push:
284 push:
284− - meta_scope: meta.embedded.substatement.powershell
285 - meta_content_scope: interpolated.complex.source.powershell
285 - meta_content_scope: interpolated.complex.source.powershell
286− - match: (\))
286+ - match: \)
287 captures:
287 captures:
288 0: punctuation.section.group.end.powershell
288 0: punctuation.section.group.end.powershell
289− 1: punctuation.section.embedded.substatement.end.powershell
290 pop: true
289 pop: true
291 - include: main
290 - include: main
291+ - include: interpolation
292+ - include: interpolatedStringContent
292 numericConstant:
293 numericConstant:
293 - match: '(?<!\w)([-+]?0(?:x|X)[0-9a-fA-F_]+(?:U|u|L|l|UL|Ul|uL|ul|LU|Lu|lU|lu)?)((?i:[kmgtp]b)?)\b'
294 - match: '(?<!\w)([-+]?0(?:x|X)[0-9a-fA-F_]+(?:U|u|L|l|UL|Ul|uL|ul|LU|Lu|lU|lu)?)((?i:[kmgtp]b)?)\b'
294 captures:
295 captures:
@@ -329,17 +330,6 @@ contexts:
329 0: punctuation.section.braces.end.powershell
330 0: punctuation.section.braces.end.powershell
330 pop: true
331 pop: true
331 - include: main
332 - include: main
332− subexpression:
333− - match: \(
334− captures:
335− 0: punctuation.section.group.begin.powershell
336− push:
337− - meta_scope: meta.group.simple.subexpression.powershell
338− - match: \)
339− captures:
340− 0: punctuation.section.group.end.powershell
341− pop: true
342− - include: main
343 type:
333 type:
344 - match: '\['
334 - match: '\['
345 captures:
335 captures:
assets/syntaxes/02_Extra/Racketdeleted−1

Submodule changed.

assets/syntaxes/02_Extra/Racket.sublime-syntaxdeleted−52
@@ -1,52 +0,0 @@
1−%YAML 1.2
2−---
3−# http://www.sublimetext.com/docs/3/syntax.html
4−name: Racket
5−file_extensions:
6− - rkt
7−scope: source.racket
8−contexts:
9− main:
10− - match: '[^\\](\"[^\"]*\")'
11− captures:
12− 1: string.quoted.double.source.racket
13− - match: '\((define)\s+([a-zA-Z0-9_\-?\+^]+)\s*'
14− scope: meta.variable.source.racket
15− captures:
16− 1: keyword.source.racket
17− 2: entity.name.variable.source.racket
18− - match: '\((define)\s+\(([a-zA-Z0-9_\-?\+^]+)\s*'
19− scope: meta.function.source.racket
20− captures:
21− 1: keyword.source.racket
22− 2: entity.name.function
23− - match: '\((struct)\s+([a-zA-Z0-9_\-?\+^]+)\s+'
24− scope: meta.struct.source.racket
25− captures:
26− 1: keyword.source.racket
27− 2: entity.name.type
28− - match: '[\s\(](if|lambda|cond|define|type-case|let|letrec|let!|\#lang|require|test|else|first|rest|define-type|define-type-alias|define-struct|not|local|error|lang)[\s\)]'
29− scope: meta.keywords.source.racket
30− captures:
31− 1: keyword.source.racket
32− - match: '[\s\(](true|false|empty|null)[\s\)]'
33− captures:
34− 1: constant.language.source.racket
35− - match: '[\s\(\[\{](#t|#true|#f|#false)[\s\)\]\}]'
36− captures:
37− 1: constant.language.source.racket
38− - match: '(#\\[a-zA-Z0-9_\-?\+\.\!\"]+)'
39− captures:
40− 1: constant.language.source.racket
41− - match: '\b(0|([1-9][0-9_]*))\b'
42− scope: constant.numeric.integer.source.racket
43− - match: ;
44− push:
45− - meta_scope: comment.line.documentation.source.racket
46− - match: $\n
47− pop: true
48− - match: '#\|'
49− push:
50− - meta_scope: comment.block.source.racket
51− - match: '\|#'
52− pop: true
assets/syntaxes/02_Extra/Robot.sublime-syntax+1−2
@@ -1,10 +1,9 @@
1%YAML 1.2
1%YAML 1.2
2---
2---
3# http://www.sublimetext.com/docs/3/syntax.html
3# http://www.sublimetext.com/docs/3/syntax.html
4−name: Robot Framework
4+name: Robot Framework syntax highlighting.
5file_extensions:
5file_extensions:
6 - robot
6 - robot
7− - resource
8scope: source.robot
7scope: source.robot
9contexts:
8contexts:
10 main:
9 main:
assets/syntaxes/02_Extra/SCSS_Sass+1−1

Submodule changed.

assets/syntaxes/02_Extra/Slimdeleted−1

Submodule changed.

assets/syntaxes/02_Extra/Slim.sublime-syntaxdeleted−306
@@ -1,306 +0,0 @@
1−%YAML 1.2
2−---
3−# http://www.sublimetext.com/docs/syntax.html
4−name: Ruby Slim
5−file_extensions:
6− - slim
7− - skim
8−scope: text.slim
9−contexts:
10− main:
11− - match: ^(\s*)(ruby):$
12− captures:
13− 2: constant.language.name.ruby.filter.slim
14− push:
15− - meta_scope: text.ruby.filter.slim
16− - match: ^(?!(\1\s)|\s*$)
17− pop: true
18− - include: scope:source.ruby
19− - match: ^(\s*)(javascript):$
20− captures:
21− 2: constant.language.name.javascript.filter.slim
22− push:
23− - meta_scope: source.js.filter.slim
24− - match: ^(?!(\1\s)|\s*$)
25− pop: true
26− - include: scope:source.js
27− - match: ^(---)\s*\n
28− captures:
29− 1: storage.frontmatter.slim
30− push:
31− - meta_scope: source.yaml.meta.slim
32− - match: ^(---)\s*\n
33− captures:
34− 1: storage.frontmatter.slim
35− pop: true
36− - include: scope:source.yaml
37− - match: ^(\s*)(coffee):$
38− captures:
39− 2: constant.language.name.coffeescript.filter.slim
40− push:
41− - meta_scope: text.coffeescript.filter.slim
42− - match: ^(?!(\1\s)|\s*$)
43− pop: true
44− - include: scope:source.coffee
45− - match: ^(\s*)(markdown):$
46− captures:
47− 2: constant.language.name.markdown.filter.slim
48− push:
49− - meta_scope: text.markdown.filter.slim
50− - match: ^(?!(\1\s)|\s*$)
51− pop: true
52− - include: scope:text.html.markdown
53− - match: ^(\s*)(css):$
54− captures:
55− 2: constant.language.name.css.filter.slim
56− push:
57− - meta_scope: text.css.filter.slim
58− - match: ^(?!(\1\s)|\s*$)
59− pop: true
60− - include: scope:source.css
61− - match: ^(\s*)(sass):$
62− captures:
63− 2: constant.language.name.sass.filter.slim
64− push:
65− - meta_scope: text.sass.filter.slim
66− - match: ^(?!(\1\s)|\s*$)
67− pop: true
68− - include: scope:source.sass
69− - match: ^(\s*)(scss):$
70− captures:
71− 2: constant.language.name.scss.filter.slim
72− push:
73− - meta_scope: text.scss.filter.slim
74− - match: ^(?!(\1\s)|\s*$)
75− pop: true
76− - include: scope:source.scss
77− - match: ^(\s*)(less):$
78− captures:
79− 2: constant.language.name.less.filter.slim
80− push:
81− - meta_scope: text.less.filter.slim
82− - match: ^(?!(\1\s)|\s*$)
83− pop: true
84− - include: scope:source.less
85− - match: ^(\s*)(erb):$
86− captures:
87− 2: constant.language.name.erb.filter.slim
88− push:
89− - meta_scope: text.erb.filter.slim
90− - match: ^(?!(\1\s)|\s*$)
91− pop: true
92− - include: scope:source.erb
93− - match: ^(! )($|\s.*)
94− scope: meta.prolog.slim
95− captures:
96− 1: punctuation.definition.prolog.slim
97− - match: ^(\s*)(/)\s*.*$
98− captures:
99− 2: comment.line.slash.slim
100− push:
101− - meta_scope: comment.block.slim
102− - match: ^(?!(\1\s)|\s*$)
103− pop: true
104− - match: ^\s*(?=-)
105− push:
106− - match: $
107− pop: true
108− - include: rubyline
109− - match: (?==+|~)
110− push:
111− - match: $
112− pop: true
113− - include: rubyline
114− - include: tag-attribute
115− - include: embedded-ruby
116− - match: ^(\s*)(\||')\s*
117− comment: Verbatim text (can include HTML tags and copied lines)
118− push:
119− - match: ^(?!(\1\s)|\s*$)
120− pop: true
121− - include: scope:text.html.basic
122− - include: embedded-ruby
123− - match: '^\s*(\.|#|[-a-zA-Z0-9]+)([\w-]+)?'
124− comment: '1 - dot OR hash OR any combination of word, number; 2 - OPTIONAL any combination of word, number, dash or underscore (following a . or'
125− captures:
126− 1: entity.name.tag.slim
127− 2: entity.other.attribute-name.event.slim
128− push:
129− - meta_scope: meta.tag
130− - match: '$|(?!\.|#|:|-|~|/|\}|\]|\*|\s?[\*\{])'
131− captures:
132− 1: entity.name.tag.slim
133− 2: entity.other.attribute-name.event.slim
134− pop: true
135− - match: '(:[\w\d]+)+'
136− comment: XML
137− push:
138− - meta_scope: entity.name.tag.slim
139− - match: $|\s
140− pop: true
141− - match: '(:\s)(\.|#|[a-zA-Z0-9]+)([\w-]+)?'
142− comment: Inline HTML / 1 - colon; 2 - dot OR hash OR any combination of word, number; 3 - OPTIONAL any combination of word, number, dash or underscore (following a . or
143− captures:
144− 1: punctuation.definition.tag.end.slim
145− 2: entity.name.tag.slim
146− 3: entity.other.attribute-name.event.slim
147− push:
148− - match: '$|(?!\.|#|=|-|~|/|\}|\]|\*|\s?[\*\{])'
149− captures:
150− 1: punctuation.definition.tag.end.slim
151− 2: entity.name.tag.slim
152− 3: entity.other.attribute-name.event.slim
153− pop: true
154− - include: root-class-id-tag
155− - include: tag-attribute
156− - match: '(\*\{)(?=.*\}|.*\|\s*$)'
157− comment: Splat attributes
158− captures:
159− 1: punctuation.section.embedded.ruby
160− push:
161− - meta_scope: source.ruby.embedded.slim
162− - match: '(\})|$|^(?!.*\|\s*$)'
163− captures:
164− 1: punctuation.section.embedded.ruby
165− pop: true
166− - include: embedded-ruby
167− - include: root-class-id-tag
168− - include: rubyline
169− - match: /
170− scope: punctuation.terminator.tag.slim
171− - match: ^\s*(\\.)
172− captures:
173− 1: meta.escape.slim
174− - match: ^\s*(?=\||')
175− push:
176− - match: $
177− pop: true
178− - include: embedded-ruby
179− - include: scope:text.html.basic
180− - match: '(?=<[\w\d\:]+)'
181− comment: Inline and root-level HTML tags
182− push:
183− - match: $|\/\>
184− pop: true
185− - include: scope:text.html.basic
186− continuation:
187− - match: '([\\,])\s*\n'
188− captures:
189− 1: punctuation.separator.continuation.slim
190− delimited-ruby-a:
191− - match: '=\('
192− push:
193− - meta_scope: source.ruby.embedded.slim
194− - match: \)(?=( \w|$))
195− pop: true
196− - include: scope:source.ruby.rails
197− delimited-ruby-b:
198− - match: '=\['
199− push:
200− - meta_scope: source.ruby.embedded.slim
201− - match: '\](?=( \w|$))'
202− pop: true
203− - include: scope:source.ruby.rails
204− delimited-ruby-c:
205− - match: '=\{'
206− push:
207− - meta_scope: source.ruby.embedded.slim
208− - match: '\}(?=( \w|$))'
209− pop: true
210− - include: scope:source.ruby.rails
211− embedded-ruby:
212− - match: '(?<!\\)#\{{1,2}'
213− captures:
214− 0: punctuation.section.embedded.ruby
215− push:
216− - meta_scope: source.ruby.embedded.html
217− - match: '\}{1,2}'
218− captures:
219− 0: punctuation.section.embedded.ruby
220− pop: true
221− - include: scope:source.ruby.rails
222− entities:
223− - match: '(&)([a-zA-Z0-9]+|#[0-9]+|#x[0-9a-fA-F]+)(;)'
224− scope: constant.character.entity.html
225− captures:
226− 1: punctuation.definition.entity.html
227− 3: punctuation.definition.entity.html
228− - match: '&'
229− scope: invalid.illegal.bad-ampersand.html
230− interpolated-ruby:
231− - match: '=(?=\b)'
232− push:
233− - meta_scope: source.ruby.embedded.html
234− - match: \s|\w$
235− pop: true
236− root-class-id-tag:
237− - match: '(\.|#)([\w\d\-]+)'
238− captures:
239− 1: punctuation.separator.key-value.html
240− 2: entity.other.attribute-name.html
241− rubyline:
242− - match: (==|=)(<>|><|<'|'<|<|>)?|-
243− comment: Hack to thwart Sublime's Ruby highlighter. It thinks do without a variable continues the next line (this can be muted with a / at the end of the line). For things like yields, do is unnecessary without an argument, so this hack will suffice
244− push:
245− - meta_scope: meta.line.ruby.slim
246− - meta_content_scope: source.ruby.embedded.slim
247− - match: (do\s*\n$)|(?<!\\|,|,\n|\\\n)$
248− captures:
249− 1: keyword.control.start-block.ruby
250− pop: true
251− - match: '#.*$'
252− comment: Hack to let ruby comments work in this context properly
253− scope: comment.line.number-sign.ruby
254− - include: continuation
255− - include: scope:source.ruby.rails
256− string-double-quoted:
257− - match: (")(?=.*")
258− captures:
259− 0: punctuation.definition.string.begin.html
260− push:
261− - meta_scope: string.quoted.double.html
262− - meta_content_scope: meta.toc-list.id.html
263− - match: '"'
264− captures:
265− 0: punctuation.definition.string.end.html
266− pop: true
267− - include: embedded-ruby
268− - include: entities
269− string-single-quoted:
270− - match: (')(?=.*')
271− captures:
272− 0: punctuation.definition.string.begin.html
273− push:
274− - meta_scope: string.quoted.single.html
275− - meta_content_scope: meta.toc-list.id.html
276− - match: "'"
277− captures:
278− 0: punctuation.definition.string.end.html
279− pop: true
280− - include: embedded-ruby
281− - include: entities
282− tag-attribute:
283− - match: '([\w.#_-]+)(=)(?!\s)(true|false|nil)?(\s*\(|\{)?'
284− captures:
285− 1: entity.other.attribute-name.event.slim
286− 2: punctuation.separator.key-value.html
287− 3: constant.language.slim
288− push:
289− - meta_scope: meta.attribute-with-value.slim
290− - match: '\}|\)|$'
291− captures:
292− 1: entity.other.attribute-name.event.slim
293− 2: punctuation.separator.key-value.html
294− 3: constant.language.slim
295− pop: true
296− - include: tag-stuff
297− - include: string-double-quoted
298− - include: string-single-quoted
299− tag-stuff:
300− - include: tag-attribute
301− - include: interpolated-ruby
302− - include: delimited-ruby-a
303− - include: delimited-ruby-b
304− - include: delimited-ruby-c
305− - include: rubyline
306− - include: embedded-ruby
assets/syntaxes/02_Extra/Stylus.sublime-syntax+2−2
@@ -197,7 +197,7 @@ contexts:
197 scope: entity.other.attribute-name.stylus
197 scope: entity.other.attribute-name.stylus
198 - match: |-
198 - match: |-
199 (?x) # multi-line regex definition mode
199 (?x) # multi-line regex definition mode
200− (?<=^|;|{)\s* # starts after beginning of line, '{' or ';''
200+ (?<=^|;|{)\s* # starts after begining of line, '{' or ';''
201 (?= # lookahead for
201 (?= # lookahead for
202 (
202 (
203 [a-zA-Z0-9_-] # then a letter
203 [a-zA-Z0-9_-] # then a letter
@@ -207,7 +207,7 @@ contexts:
207 (/\*.*?\*/) # comment
207 (/\*.*?\*/) # comment
208 )+
208 )+
209
209
210− \s*[:\s]\s* # value is separated by colon or space
210+ \s*[:\s]\s* # value is separted by colon or space
211
211
212 (?!(\s*\{)) # if there are only spaces afterwards
212 (?!(\s*\{)) # if there are only spaces afterwards
213
213
assets/syntaxes/02_Extra/SublimeEthereumdeleted−1

Submodule changed.

assets/syntaxes/02_Extra/SublimeJQdeleted−1

Submodule changed.

assets/syntaxes/02_Extra/Sveltedeleted−1

Submodule changed.

assets/syntaxes/02_Extra/Syslognew file+1

Submodule changed.

assets/syntaxes/02_Extra/SystemVerilogdeleted−1

Submodule changed.

assets/syntaxes/02_Extra/TOML+1−1

Submodule changed.

assets/syntaxes/02_Extra/Terraform+1−1

Submodule changed.

assets/syntaxes/02_Extra/TypeScript+1−1

Submodule changed.

assets/syntaxes/02_Extra/TypeScript.sublime-syntax+148−206
@@ -44,7 +44,7 @@ contexts:
44 - match: (?=$)
44 - match: (?=$)
45 pop: true
45 pop: true
46 access-modifier:
46 access-modifier:
47− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(abstract|declare|override|public|protected|private|readonly|static)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
47+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(abstract|public|protected|private|readonly|static|declare)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
48 scope: storage.modifier.ts
48 scope: storage.modifier.ts
49 after-operator-block-as-object-literal:
49 after-operator-block-as-object-literal:
50 - match: '(?<!\+\+|--)(?<=[:=(,\[?+!>]|^await|[^\._$[:alnum:]]await|^return|[^\._$[:alnum:]]return|^yield|[^\._$[:alnum:]]yield|^throw|[^\._$[:alnum:]]throw|^in|[^\._$[:alnum:]]in|^of|[^\._$[:alnum:]]of|^typeof|[^\._$[:alnum:]]typeof|&&|\|\||\*)\s*(\{)'
50 - match: '(?<!\+\+|--)(?<=[:=(,\[?+!>]|^await|[^\._$[:alnum:]]await|^return|[^\._$[:alnum:]]return|^yield|[^\._$[:alnum:]]yield|^throw|[^\._$[:alnum:]]throw|^in|[^\._$[:alnum:]]in|^of|[^\._$[:alnum:]]of|^typeof|[^\._$[:alnum:]]typeof|&&|\|\||\*)\s*(\{)'
@@ -106,7 +106,7 @@ contexts:
106 (?=
106 (?=
107 # sure shot arrow functions even if => is on new line
107 # sure shot arrow functions even if => is on new line
108 (
108 (
109− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
109+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
110 [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
110 [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
111 (
111 (
112 ([)]\s*:) | # ():
112 ([)]\s*:) | # ():
@@ -116,9 +116,9 @@ contexts:
116
116
117 # arrow function possible to detect only with => on same line
117 # arrow function possible to detect only with => on same line
118 (
118 (
119− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
119+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
120− \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
120+ \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
121− (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
121+ (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
122 \s*=> # arrow operator
122 \s*=> # arrow operator
123 )
123 )
124 )
124 )
@@ -268,7 +268,7 @@ contexts:
268 - include: decorator
268 - include: decorator
269 - match: (?<=:)\s*
269 - match: (?<=:)\s*
270 push:
270 push:
271− - match: '(?=\s|[;),}\]:\-\+]|;|^\s*$|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))'
271+ - match: '(?=\s|[;),}\]:\-\+]|;|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))'
272 pop: true
272 pop: true
273 - include: expression
273 - include: expression
274 - include: method-declaration
274 - include: method-declaration
@@ -317,12 +317,7 @@ contexts:
317 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(break|continue|do|goto|while)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
317 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(break|continue|do|goto|while)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
318 scope: keyword.control.loop.ts
318 scope: keyword.control.loop.ts
319 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(return)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
319 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(return)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
320− captures:
321− 0: keyword.control.flow.ts
320+ scope: keyword.control.flow.ts
322− push:
323− - match: '(?=[;}]|$|;|^\s*$|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))'
324− pop: true
325− - include: expression
326 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(case|default|switch)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
321 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(case|default|switch)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
327 scope: keyword.control.switch.ts
322 scope: keyword.control.switch.ts
328 - include: if-statement
323 - include: if-statement
@@ -767,7 +762,7 @@ contexts:
767 4: keyword.control.default.ts
762 4: keyword.control.default.ts
768 push:
763 push:
769 - meta_scope: meta.export.default.ts
764 - meta_scope: meta.export.default.ts
770− - match: (?=$|;|^\s*$|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))
765+ - match: (?=$|;|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))
771 pop: true
766 pop: true
772 - include: interface-declaration
767 - include: interface-declaration
773 - include: expression
768 - include: expression
@@ -777,7 +772,7 @@ contexts:
777 2: keyword.control.type.ts
772 2: keyword.control.type.ts
778 push:
773 push:
779 - meta_scope: meta.export.ts
774 - meta_scope: meta.export.ts
780− - match: (?=$|;|^\s*$|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))
775+ - match: (?=$|;|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))
781 pop: true
776 pop: true
782 - include: import-export-declaration
777 - include: import-export-declaration
783 expression:
778 expression:
@@ -790,11 +785,11 @@ contexts:
790 - include: string
785 - include: string
791 - include: decorator
786 - include: decorator
792 - include: destructuring-parameter
787 - include: destructuring-parameter
793− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(override|public|protected|private|readonly)\s+(?=(override|public|protected|private|readonly)\s+)'
788+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(public|protected|private|readonly)\s+(?=(public|protected|private|readonly)\s+)'
794 captures:
789 captures:
795 1: storage.modifier.ts
790 1: storage.modifier.ts
796 - match: |-
791 - match: |-
797− (?x)(?:(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(override|public|private|protected|readonly)\s+)?(?:(\.\.\.)\s*)?(?<!=|:)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(this)|([_$[:alpha:]][_$[:alnum:]]*))(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))\s*(\??)(?=\s*
792+ (?x)(?:(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(public|private|protected|readonly)\s+)?(?:(\.\.\.)\s*)?(?<!=|:)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(this)|([_$[:alpha:]][_$[:alnum:]]*))(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))\s*(\??)(?=\s*
798 # function assignment |
793 # function assignment |
799 (=\s*(
794 (=\s*(
800 ((async\s+)?(
795 ((async\s+)?(
@@ -803,10 +798,10 @@ contexts:
803 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
798 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
804 )) |
799 )) |
805 ((async\s*)?(
800 ((async\s*)?(
806− ((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
801+ ((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{[^\{\}]*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[[^\[\]]*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
807 # sure shot arrow functions even if => is on new line
802 # sure shot arrow functions even if => is on new line
808 (
803 (
809− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
804+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
810 [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
805 [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
811 (
806 (
812 ([)]\s*:) | # ():
807 ([)]\s*:) | # ():
@@ -816,9 +811,9 @@ contexts:
816
811
817 # arrow function possible to detect only with => on same line
812 # arrow function possible to detect only with => on same line
818 (
813 (
819− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
814+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
820− \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
815+ \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
821− (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
816+ (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
822 \s*=> # arrow operator
817 \s*=> # arrow operator
823 )
818 )
824 ))
819 ))
@@ -836,18 +831,18 @@ contexts:
836 ))
831 ))
837 )) |
832 )) |
838 (:\s*(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))Function(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))) |
833 (:\s*(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))Function(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))) |
839− (:\s*((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*))))))) |
834+ (:\s*((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{[^\{\}]*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[[^\[\]]*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*))))))) |
840− (:\s*(=>|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(<[^<>]*>)|[^<>(),=])+=\s*(
835+ (:\s*(=>|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(<[^<>]*>)|[^<>(),=])+=\s*(
841 ((async\s+)?(
836 ((async\s+)?(
842 (function\s*[(<*]) |
837 (function\s*[(<*]) |
843 (function\s+) |
838 (function\s+) |
844 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
839 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
845 )) |
840 )) |
846 ((async\s*)?(
841 ((async\s*)?(
847− ((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
842+ ((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{[^\{\}]*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[[^\[\]]*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
848 # sure shot arrow functions even if => is on new line
843 # sure shot arrow functions even if => is on new line
849 (
844 (
850− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
845+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
851 [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
846 [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
852 (
847 (
853 ([)]\s*:) | # ():
848 ([)]\s*:) | # ():
@@ -857,9 +852,9 @@ contexts:
857
852
858 # arrow function possible to detect only with => on same line
853 # arrow function possible to detect only with => on same line
859 (
854 (
860− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
855+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
861− \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
856+ \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
862− (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
857+ (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
863 \s*=> # arrow operator
858 \s*=> # arrow operator
864 )
859 )
865 ))
860 ))
@@ -870,7 +865,7 @@ contexts:
870 3: entity.name.function.ts variable.language.this.ts
865 3: entity.name.function.ts variable.language.this.ts
871 4: entity.name.function.ts
866 4: entity.name.function.ts
872 5: keyword.operator.optional.ts
867 5: keyword.operator.optional.ts
873− - match: '(?x)(?:(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(override|public|private|protected|readonly)\s+)?(?:(\.\.\.)\s*)?(?<!=|:)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(this)|([_$[:alpha:]][_$[:alnum:]]*))(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))\s*(\??)(?=\s*[:,]|$)'
868+ - match: '(?x)(?:(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(public|private|protected|readonly)\s+)?(?:(\.\.\.)\s*)?(?<!=|:)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(this)|([_$[:alpha:]][_$[:alnum:]]*))(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))\s*(\??)(?=\s*[:,]|$)'
874 captures:
869 captures:
875 1: storage.modifier.ts
870 1: storage.modifier.ts
876 2: keyword.operator.rest.ts
871 2: keyword.operator.rest.ts
@@ -935,11 +930,10 @@ contexts:
935 scope: keyword.operator.comparison.ts
930 scope: keyword.operator.comparison.ts
936 - match: <=|>=|<>|<|>
931 - match: <=|>=|<>|<|>
937 scope: keyword.operator.relational.ts
932 scope: keyword.operator.relational.ts
938− - match: '(?<=[_$[:alnum:]])(\!)\s*(?:(/=)|(?:(/)(?![/*])))'
933+ - match: '(?<=[_$[:alnum:]])(\!)\s*(/)(?![/*])'
939 captures:
934 captures:
940 1: keyword.operator.logical.ts
935 1: keyword.operator.logical.ts
941− 2: keyword.operator.assignment.compound.ts
936+ 2: keyword.operator.arithmetic.ts
942− 3: keyword.operator.arithmetic.ts
943 - match: \!|&&|\|\||\?\?
937 - match: \!|&&|\|\||\?\?
944 scope: keyword.operator.logical.ts
938 scope: keyword.operator.logical.ts
945 - match: \&|~|\^|\|
939 - match: \&|~|\^|\|
@@ -952,18 +946,16 @@ contexts:
952 scope: keyword.operator.increment.ts
946 scope: keyword.operator.increment.ts
953 - match: '%|\*|/|-|\+'
947 - match: '%|\*|/|-|\+'
954 scope: keyword.operator.arithmetic.ts
948 scope: keyword.operator.arithmetic.ts
955− - match: '(?<=[_$[:alnum:])\]])\s*(?=(\/\*([^\*]|(\*[^\/]))*\*\/\s*)+(?:(/=)|(?:(/)(?![/*]))))'
949+ - match: '(?<=[_$[:alnum:])\]])\s*(?=(\/\*([^\*]|(\*[^\/]))*\*\/\s*)+(/)(?![/*]))'
956 push:
950 push:
957− - match: '(?:(/=)|(?:(/)(?!\*([^\*]|(\*[^\/]))*\*\/)))'
951+ - match: '(/)(?!\*([^\*]|(\*[^\/]))*\*\/)'
958 captures:
952 captures:
959− 1: keyword.operator.assignment.compound.ts
953+ 1: keyword.operator.arithmetic.ts
960− 2: keyword.operator.arithmetic.ts
961 pop: true
954 pop: true
962 - include: comment
955 - include: comment
963− - match: '(?<=[_$[:alnum:])\]])\s*(?:(/=)|(?:(/)(?![/*])))'
956+ - match: '(?<=[_$[:alnum:])\]])\s*(/)(?![/*])'
964 captures:
957 captures:
965− 1: keyword.operator.assignment.compound.ts
958+ 1: keyword.operator.arithmetic.ts
966− 2: keyword.operator.arithmetic.ts
967 expressionPunctuations:
959 expressionPunctuations:
968 - include: punctuation-comma
960 - include: punctuation-comma
969 - include: punctuation-accessor
961 - include: punctuation-accessor
@@ -1029,10 +1021,10 @@ contexts:
1029 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
1021 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
1030 )) |
1022 )) |
1031 ((async\s*)?(
1023 ((async\s*)?(
1032− ((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
1024+ ((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{[^\{\}]*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[[^\[\]]*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
1033 # sure shot arrow functions even if => is on new line
1025 # sure shot arrow functions even if => is on new line
1034 (
1026 (
1035− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
1027+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
1036 [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
1028 [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
1037 (
1029 (
1038 ([)]\s*:) | # ():
1030 ([)]\s*:) | # ():
@@ -1042,9 +1034,9 @@ contexts:
1042
1034
1043 # arrow function possible to detect only with => on same line
1035 # arrow function possible to detect only with => on same line
1044 (
1036 (
1045− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
1037+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
1046− \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
1038+ \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
1047− (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
1039+ (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
1048 \s*=> # arrow operator
1040 \s*=> # arrow operator
1049 )
1041 )
1050 ))
1042 ))
@@ -1062,18 +1054,18 @@ contexts:
1062 ))
1054 ))
1063 )) |
1055 )) |
1064 (:\s*(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))Function(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))) |
1056 (:\s*(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))Function(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))) |
1065− (:\s*((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*))))))) |
1057+ (:\s*((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{[^\{\}]*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[[^\[\]]*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*))))))) |
1066− (:\s*(=>|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(<[^<>]*>)|[^<>(),=])+=\s*(
1058+ (:\s*(=>|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(<[^<>]*>)|[^<>(),=])+=\s*(
1067 ((async\s+)?(
1059 ((async\s+)?(
1068 (function\s*[(<*]) |
1060 (function\s*[(<*]) |
1069 (function\s+) |
1061 (function\s+) |
1070 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
1062 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
1071 )) |
1063 )) |
1072 ((async\s*)?(
1064 ((async\s*)?(
1073− ((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
1065+ ((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{[^\{\}]*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[[^\[\]]*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
1074 # sure shot arrow functions even if => is on new line
1066 # sure shot arrow functions even if => is on new line
1075 (
1067 (
1076− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
1068+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
1077 [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
1069 [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
1078 (
1070 (
1079 ([)]\s*:) | # ():
1071 ([)]\s*:) | # ():
@@ -1083,9 +1075,9 @@ contexts:
1083
1075
1084 # arrow function possible to detect only with => on same line
1076 # arrow function possible to detect only with => on same line
1085 (
1077 (
1086− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
1078+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
1087− \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
1079+ \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
1088− (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
1080+ (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
1089 \s*=> # arrow operator
1081 \s*=> # arrow operator
1090 )
1082 )
1091 ))
1083 ))
@@ -1126,19 +1118,18 @@ contexts:
1126 - include: type-parameters
1118 - include: type-parameters
1127 - include: function-parameters
1119 - include: function-parameters
1128 - include: return-type
1120 - include: return-type
1129− - include: type-function-return-type
1130 - include: decl-block
1121 - include: decl-block
1131 - match: \*
1122 - match: \*
1132 scope: keyword.generator.asterisk.ts
1123 scope: keyword.generator.asterisk.ts
1133 function-call:
1124 function-call:
1134− - match: '(?=(((([_$[:alpha:]][_$[:alnum:]]*)(\s*\??\.\s*(\#?[_$[:alpha:]][_$[:alnum:]]*))*)|(\??\.\s*\#?[_$[:alpha:]][_$[:alnum:]]*))|(?<=[\)]))\s*(?:(\?\.\s*)|(\!))?((<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))(([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>)*(?<!=)\>))*(?<!=)\>)*(?<!=)>\s*)?\())'
1125+ - match: '(?=(((([_$[:alpha:]][_$[:alnum:]]*)(\s*\??\.\s*(\#?[_$[:alpha:]][_$[:alnum:]]*))*)|(\??\.\s*\#?[_$[:alpha:]][_$[:alnum:]]*))|(?<=[\)]))\s*(?:(\?\.\s*)|(\!))?((<\s*(((keyof|infer|awaited|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|awaited|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))(([^<>\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|awaited|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?<==)\>)*(?<!=)\>))*(?<!=)\>)*(?<!=)>\s*)?\())'
1135 push:
1126 push:
1136− - match: '(?<=\))(?!(((([_$[:alpha:]][_$[:alnum:]]*)(\s*\??\.\s*(\#?[_$[:alpha:]][_$[:alnum:]]*))*)|(\??\.\s*\#?[_$[:alpha:]][_$[:alnum:]]*))|(?<=[\)]))\s*(?:(\?\.\s*)|(\!))?((<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))(([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>)*(?<!=)\>))*(?<!=)\>)*(?<!=)>\s*)?\())'
1127+ - match: '(?<=\))(?!(((([_$[:alpha:]][_$[:alnum:]]*)(\s*\??\.\s*(\#?[_$[:alpha:]][_$[:alnum:]]*))*)|(\??\.\s*\#?[_$[:alpha:]][_$[:alnum:]]*))|(?<=[\)]))\s*(?:(\?\.\s*)|(\!))?((<\s*(((keyof|infer|awaited|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|awaited|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))(([^<>\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|awaited|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?<==)\>)*(?<!=)\>))*(?<!=)\>)*(?<!=)>\s*)?\())'
1137 pop: true
1128 pop: true
1138 - match: '(?=(([_$[:alpha:]][_$[:alnum:]]*)(\s*\??\.\s*(\#?[_$[:alpha:]][_$[:alnum:]]*))*)|(\??\.\s*\#?[_$[:alpha:]][_$[:alnum:]]*))'
1129 - match: '(?=(([_$[:alpha:]][_$[:alnum:]]*)(\s*\??\.\s*(\#?[_$[:alpha:]][_$[:alnum:]]*))*)|(\??\.\s*\#?[_$[:alpha:]][_$[:alnum:]]*))'
1139 push:
1130 push:
1140 - meta_scope: meta.function-call.ts
1131 - meta_scope: meta.function-call.ts
1141− - match: '(?=\s*(?:(\?\.\s*)|(\!))?((<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))(([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>)*(?<!=)\>))*(?<!=)\>)*(?<!=)>\s*)?\())'
1132+ - match: '(?=\s*(?:(\?\.\s*)|(\!))?((<\s*(((keyof|infer|awaited|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|awaited|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))(([^<>\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|awaited|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?<==)\>)*(?<!=)\>))*(?<!=)\>)*(?<!=)>\s*)?\())'
1142 pop: true
1133 pop: true
1143 - include: function-call-target
1134 - include: function-call-target
1144 - include: comment
1135 - include: comment
@@ -1178,7 +1169,7 @@ contexts:
1178 6: meta.definition.function.ts entity.name.function.ts
1169 6: meta.definition.function.ts entity.name.function.ts
1179 push:
1170 push:
1180 - meta_scope: meta.function.ts
1171 - meta_scope: meta.function.ts
1181− - match: '(?=;|^\s*$|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))|(?<=\})'
1172+ - match: '(?=;|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))|(?<=\})'
1182 pop: true
1173 pop: true
1183 - include: function-name
1174 - include: function-name
1184 - include: function-body
1175 - include: function-body
@@ -1230,10 +1221,10 @@ contexts:
1230 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
1221 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
1231 )) |
1222 )) |
1232 ((async\s*)?(
1223 ((async\s*)?(
1233− ((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
1224+ ((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{[^\{\}]*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[[^\[\]]*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
1234 # sure shot arrow functions even if => is on new line
1225 # sure shot arrow functions even if => is on new line
1235 (
1226 (
1236− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
1227+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
1237 [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
1228 [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
1238 (
1229 (
1239 ([)]\s*:) | # ():
1230 ([)]\s*:) | # ():
@@ -1243,9 +1234,9 @@ contexts:
1243
1234
1244 # arrow function possible to detect only with => on same line
1235 # arrow function possible to detect only with => on same line
1245 (
1236 (
1246− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
1237+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
1247− \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
1238+ \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
1248− (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
1239+ (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
1249 \s*=> # arrow operator
1240 \s*=> # arrow operator
1250 )
1241 )
1251 ))
1242 ))
@@ -1269,7 +1260,7 @@ contexts:
1269 - match: "[_$[:alpha:]][_$[:alnum:]]*"
1260 - match: "[_$[:alpha:]][_$[:alnum:]]*"
1270 scope: variable.other.readwrite.ts
1261 scope: variable.other.readwrite.ts
1271 if-statement:
1262 if-statement:
1272− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?=\bif\s*(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))\s*(?!\{))'
1263+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?=\bif\s*(\(([^\(\)]|(\([^\(\)]*\)))*\))\s*(?!\{))'
1273 push:
1264 push:
1274 - match: '(?=;|$|\})'
1265 - match: '(?=;|$|\})'
1275 pop: true
1266 pop: true
@@ -1284,12 +1275,12 @@ contexts:
1284 0: meta.brace.round.ts
1275 0: meta.brace.round.ts
1285 pop: true
1276 pop: true
1286 - include: expression
1277 - include: expression
1287− - match: '(?<=\))\s*\/(?![\/*])(?=(?:[^\/\\\[]|\\.|\[([^\]\\]|\\.)*\])+\/([dgimsuy]+|(?![\/\*])|(?=\/\*))(?!\s*[a-zA-Z0-9_$]))'
1278+ - match: '(?<=\))\s*\/(?![\/*])(?=(?:[^\/\\\[]|\\.|\[([^\]\\]|\\.)+\])+\/([gimsuy]+|(?![\/\*])|(?=\/\*))(?!\s*[a-zA-Z0-9_$]))'
1288 captures:
1279 captures:
1289 0: punctuation.definition.string.begin.ts
1280 0: punctuation.definition.string.begin.ts
1290 push:
1281 push:
1291 - meta_scope: string.regexp.ts
1282 - meta_scope: string.regexp.ts
1292− - match: "(/)([dgimsuy]*)"
1283+ - match: "(/)([gimsuy]*)"
1293 captures:
1284 captures:
1294 1: punctuation.definition.string.end.ts
1285 1: punctuation.definition.string.end.ts
1295 2: keyword.other.ts
1286 2: keyword.other.ts
@@ -1423,9 +1414,6 @@ contexts:
1423 2: keyword.operator.type.modifier.ts
1414 2: keyword.operator.type.modifier.ts
1424 3: keyword.operator.optional.ts
1415 3: keyword.operator.optional.ts
1425 pop: true
1416 pop: true
1426− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(as)\s+'
1427− captures:
1428− 1: keyword.control.as.ts
1429 - include: type
1417 - include: type
1430 inline-tags:
1418 inline-tags:
1431 - match: '(\[)[^\]]+(\])(?={@(?:link|linkcode|linkplain|tutorial))'
1419 - match: '(\[)[^\]]+(\])(?={@(?:link|linkcode|linkplain|tutorial))'
@@ -1516,27 +1504,25 @@ contexts:
1516 - include: this-literal
1504 - include: this-literal
1517 - include: super-literal
1505 - include: super-literal
1518 method-declaration:
1506 method-declaration:
1519− - match: '(?x)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:\b(override)\s+)?(?:\b(public|private|protected)\s+)?(?:\b(abstract)\s+)?(?:\b(async)\s+)?\s*\b(constructor)\b(?!:)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
1507+ - match: '(?x)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:\b(public|private|protected)\s+)?(?:\b(abstract)\s+)?(?:\b(async)\s+)?\s*\b(constructor)\b(?!:)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
1520 captures:
1508 captures:
1521 1: storage.modifier.ts
1509 1: storage.modifier.ts
1522 2: storage.modifier.ts
1510 2: storage.modifier.ts
1523− 3: storage.modifier.ts
1511+ 3: storage.modifier.async.ts
1524− 4: storage.modifier.async.ts
1525− 5: storage.type.ts
1512+ 4: storage.type.ts
1526 push:
1513 push:
1527 - meta_scope: meta.method.declaration.ts
1514 - meta_scope: meta.method.declaration.ts
1528 - match: '(?=\}|;|,|$)|(?<=\})'
1515 - match: '(?=\}|;|,|$)|(?<=\})'
1529 pop: true
1516 pop: true
1530 - include: method-declaration-name
1517 - include: method-declaration-name
1531 - include: function-body
1518 - include: function-body
1532− - match: '(?x)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:\b(override)\s+)?(?:\b(public|private|protected)\s+)?(?:\b(abstract)\s+)?(?:\b(async)\s+)?(?:(?:\s*\b(new)\b(?!:)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.)))|(?:(\*)\s*)?)(?=\s*((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*))?[\(])'
1519+ - match: '(?x)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:\b(public|private|protected)\s+)?(?:\b(abstract)\s+)?(?:\b(async)\s+)?(?:(?:\s*\b(new)\b(?!:)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.)))|(?:(\*)\s*)?)(?=\s*((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*))?[\(])'
1533 captures:
1520 captures:
1534 1: storage.modifier.ts
1521 1: storage.modifier.ts
1535 2: storage.modifier.ts
1522 2: storage.modifier.ts
1536− 3: storage.modifier.ts
1523+ 3: storage.modifier.async.ts
1537− 4: storage.modifier.async.ts
1538− 5: keyword.operator.new.ts
1524+ 4: keyword.operator.new.ts
1539− 6: keyword.generator.asterisk.ts
1525+ 5: keyword.generator.asterisk.ts
1540 push:
1526 push:
1541 - meta_scope: meta.method.declaration.ts
1527 - meta_scope: meta.method.declaration.ts
1542 - match: '(?=\}|;|,|$)|(?<=\})'
1528 - match: '(?=\}|;|,|$)|(?<=\})'
@@ -1544,7 +1530,7 @@ contexts:
1544 - include: method-declaration-name
1530 - include: method-declaration-name
1545 - include: function-body
1531 - include: function-body
1546 - match: |-
1532 - match: |-
1547− (?x)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:\b(override)\s+)?(?:\b(public|private|protected)\s+)?(?:\b(abstract)\s+)?(?:\b(async)\s+)?(?:\b(get|set)\s+)?(?:(\*)\s*)?(?=\s*(((\b(?<!\$)0(?:x|X)[0-9a-fA-F][0-9a-fA-F_]*(n)?\b(?!\$))|(\b(?<!\$)0(?:b|B)[01][01_]*(n)?\b(?!\$))|(\b(?<!\$)0(?:o|O)?[0-7][0-7_]*(n)?\b(?!\$))|((?<!\$)(?:
1533+ (?x)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:\b(public|private|protected)\s+)?(?:\b(abstract)\s+)?(?:\b(async)\s+)?(?:\b(get|set)\s+)?(?:(\*)\s*)?(?=\s*(((\b(?<!\$)0(?:x|X)[0-9a-fA-F][0-9a-fA-F_]*(n)?\b(?!\$))|(\b(?<!\$)0(?:b|B)[01][01_]*(n)?\b(?!\$))|(\b(?<!\$)0(?:o|O)?[0-7][0-7_]*(n)?\b(?!\$))|((?<!\$)(?:
1548 (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1.1E+3
1534 (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1.1E+3
1549 (?:\b[0-9][0-9_]*(\.)[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1.E+3
1535 (?:\b[0-9][0-9_]*(\.)[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1.E+3
1550 (?:\B(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # .1E+3
1536 (?:\B(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # .1E+3
@@ -1553,14 +1539,13 @@ contexts:
1553 (?:\b[0-9][0-9_]*(\.)(n)?\B)| # 1.
1539 (?:\b[0-9][0-9_]*(\.)(n)?\B)| # 1.
1554 (?:\B(\.)[0-9][0-9_]*(n)?\b)| # .1
1540 (?:\B(\.)[0-9][0-9_]*(n)?\b)| # .1
1555 (?:\b[0-9][0-9_]*(n)?\b(?!\.)) # 1
1541 (?:\b[0-9][0-9_]*(n)?\b(?!\.)) # 1
1556− )(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`)|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(\??))\s*((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*))?[\(])
1542+ )(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`)|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(\??))\s*((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*))?[\(])
1557 captures:
1543 captures:
1558 1: storage.modifier.ts
1544 1: storage.modifier.ts
1559 2: storage.modifier.ts
1545 2: storage.modifier.ts
1560− 3: storage.modifier.ts
1546+ 3: storage.modifier.async.ts
1561− 4: storage.modifier.async.ts
1562− 5: storage.type.property.ts
1547+ 4: storage.type.property.ts
1563− 6: keyword.generator.asterisk.ts
1548+ 5: keyword.generator.asterisk.ts
1564 push:
1549 push:
1565 - meta_scope: meta.method.declaration.ts
1550 - meta_scope: meta.method.declaration.ts
1566 - match: '(?=\}|;|,|$)|(?<=\})'
1551 - match: '(?=\}|;|,|$)|(?<=\})'
@@ -1597,7 +1582,7 @@ contexts:
1597 3: storage.type.namespace.ts
1582 3: storage.type.namespace.ts
1598 push:
1583 push:
1599 - meta_scope: meta.namespace.declaration.ts
1584 - meta_scope: meta.namespace.declaration.ts
1600− - match: '(?<=\})|(?=;|^\s*$|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))'
1585+ - match: '(?<=\})|(?=;|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))'
1601 pop: true
1586 pop: true
1602 - include: comment
1587 - include: comment
1603 - include: string
1588 - include: string
@@ -1613,7 +1598,9 @@ contexts:
1613 - meta_scope: new.expr.ts
1598 - meta_scope: new.expr.ts
1614 - match: '(?<=\))|(?=[;),}\]:?\-\+\>]|\|\||\&\&|\!\=\=|$|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))new(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.)))|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))function((\s+[_$[:alpha:]][_$[:alnum:]]*)|(\s*[\(]))))'
1599 - match: '(?<=\))|(?=[;),}\]:?\-\+\>]|\|\||\&\&|\!\=\=|$|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))new(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.)))|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))function((\s+[_$[:alpha:]][_$[:alnum:]]*)|(\s*[\(]))))'
1615 pop: true
1600 pop: true
1616− - include: expression
1601+ - include: paren-expression
1602+ - include: class-declaration
1603+ - include: type
1617 null-literal:
1604 null-literal:
1618 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))null(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
1605 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))null(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
1619 scope: constant.language.null.ts
1606 scope: constant.language.null.ts
@@ -1794,7 +1781,7 @@ contexts:
1794 (?:\b[0-9][0-9_]*(\.)(n)?\B)| # 1.
1781 (?:\b[0-9][0-9_]*(\.)(n)?\B)| # 1.
1795 (?:\B(\.)[0-9][0-9_]*(n)?\b)| # .1
1782 (?:\B(\.)[0-9][0-9_]*(n)?\b)| # .1
1796 (?:\b[0-9][0-9_]*(n)?\b(?!\.)) # 1
1783 (?:\b[0-9][0-9_]*(n)?\b(?!\.)) # 1
1797− )(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`)|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(\??))\s*((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*))?[\(])
1784+ )(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`)|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(\??))\s*((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*))?[\(])
1798 captures:
1785 captures:
1799 1: storage.modifier.async.ts
1786 1: storage.modifier.async.ts
1800 2: storage.type.property.ts
1787 2: storage.type.property.ts
@@ -1815,7 +1802,7 @@ contexts:
1815 (?:\b[0-9][0-9_]*(\.)(n)?\B)| # 1.
1802 (?:\b[0-9][0-9_]*(\.)(n)?\B)| # 1.
1816 (?:\B(\.)[0-9][0-9_]*(n)?\b)| # .1
1803 (?:\B(\.)[0-9][0-9_]*(n)?\b)| # .1
1817 (?:\b[0-9][0-9_]*(n)?\b(?!\.)) # 1
1804 (?:\b[0-9][0-9_]*(n)?\b(?!\.)) # 1
1818− )(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`)|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(\??))\s*((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*))?[\(])
1805+ )(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`)|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(\??))\s*((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*))?[\(])
1819 captures:
1806 captures:
1820 1: storage.modifier.async.ts
1807 1: storage.modifier.async.ts
1821 2: storage.type.property.ts
1808 2: storage.type.property.ts
@@ -1877,10 +1864,10 @@ contexts:
1877 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
1864 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
1878 )) |
1865 )) |
1879 ((async\s*)?(
1866 ((async\s*)?(
1880− ((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
1867+ ((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{[^\{\}]*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[[^\[\]]*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
1881 # sure shot arrow functions even if => is on new line
1868 # sure shot arrow functions even if => is on new line
1882 (
1869 (
1883− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
1870+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
1884 [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
1871 [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
1885 (
1872 (
1886 ([)]\s*:) | # ():
1873 ([)]\s*:) | # ():
@@ -1890,9 +1877,9 @@ contexts:
1890
1877
1891 # arrow function possible to detect only with => on same line
1878 # arrow function possible to detect only with => on same line
1892 (
1879 (
1893− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
1880+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
1894− \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
1881+ \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
1895− (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
1882+ (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
1896 \s*=> # arrow operator
1883 \s*=> # arrow operator
1897 )
1884 )
1898 ))
1885 ))
@@ -1943,7 +1930,7 @@ contexts:
1943 - meta_scope: meta.object.member.ts
1930 - meta_scope: meta.object.member.ts
1944 - match: '(?=,|\})'
1931 - match: '(?=,|\})'
1945 pop: true
1932 pop: true
1946− - match: '(?<=:)\s*(async)?(?=\s*(<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)\(\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))'
1933+ - match: '(?<=:)\s*(async)?(?=\s*(<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)\(\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{[^\{\}]*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[[^\[\]]*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))'
1947 captures:
1934 captures:
1948 1: storage.modifier.async.ts
1935 1: storage.modifier.async.ts
1949 push:
1936 push:
@@ -1959,7 +1946,7 @@ contexts:
1959 0: meta.brace.round.ts
1946 0: meta.brace.round.ts
1960 pop: true
1947 pop: true
1961 - include: expression-inside-possibly-arrow-parens
1948 - include: expression-inside-possibly-arrow-parens
1962− - match: '(?<=:)\s*(async)?\s*(\()(?=\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))'
1949+ - match: '(?<=:)\s*(async)?\s*(\()(?=\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{[^\{\}]*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[[^\[\]]*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))'
1963 captures:
1950 captures:
1964 1: storage.modifier.async.ts
1951 1: storage.modifier.async.ts
1965 2: meta.brace.round.ts
1952 2: meta.brace.round.ts
@@ -1976,7 +1963,7 @@ contexts:
1976 - match: (?<=\>)
1963 - match: (?<=\>)
1977 pop: true
1964 pop: true
1978 - include: type-parameters
1965 - include: type-parameters
1979− - match: '(?<=\>)\s*(\()(?=\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))'
1966+ - match: '(?<=\>)\s*(\()(?=\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{[^\{\}]*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[[^\[\]]*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))'
1980 captures:
1967 captures:
1981 1: meta.brace.round.ts
1968 1: meta.brace.round.ts
1982 push:
1969 push:
@@ -2010,11 +1997,11 @@ contexts:
2010 - include: destructuring-parameter-rest
1997 - include: destructuring-parameter-rest
2011 - include: variable-initializer
1998 - include: variable-initializer
2012 parameter-name:
1999 parameter-name:
2013− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(override|public|protected|private|readonly)\s+(?=(override|public|protected|private|readonly)\s+)'
2000+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(public|protected|private|readonly)\s+(?=(public|protected|private|readonly)\s+)'
2014 captures:
2001 captures:
2015 1: storage.modifier.ts
2002 1: storage.modifier.ts
2016 - match: |-
2003 - match: |-
2017− (?x)(?:(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(override|public|private|protected|readonly)\s+)?(?:(\.\.\.)\s*)?(?<!=|:)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(this)|([_$[:alpha:]][_$[:alnum:]]*))(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))\s*(\??)(?=\s*
2004+ (?x)(?:(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(public|private|protected|readonly)\s+)?(?:(\.\.\.)\s*)?(?<!=|:)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(this)|([_$[:alpha:]][_$[:alnum:]]*))(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))\s*(\??)(?=\s*
2018 # function assignment |
2005 # function assignment |
2019 (=\s*(
2006 (=\s*(
2020 ((async\s+)?(
2007 ((async\s+)?(
@@ -2023,10 +2010,10 @@ contexts:
2023 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
2010 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
2024 )) |
2011 )) |
2025 ((async\s*)?(
2012 ((async\s*)?(
2026− ((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
2013+ ((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{[^\{\}]*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[[^\[\]]*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
2027 # sure shot arrow functions even if => is on new line
2014 # sure shot arrow functions even if => is on new line
2028 (
2015 (
2029− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
2016+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
2030 [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
2017 [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
2031 (
2018 (
2032 ([)]\s*:) | # ():
2019 ([)]\s*:) | # ():
@@ -2036,9 +2023,9 @@ contexts:
2036
2023
2037 # arrow function possible to detect only with => on same line
2024 # arrow function possible to detect only with => on same line
2038 (
2025 (
2039− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
2026+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
2040− \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
2027+ \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
2041− (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
2028+ (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
2042 \s*=> # arrow operator
2029 \s*=> # arrow operator
2043 )
2030 )
2044 ))
2031 ))
@@ -2056,18 +2043,18 @@ contexts:
2056 ))
2043 ))
2057 )) |
2044 )) |
2058 (:\s*(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))Function(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))) |
2045 (:\s*(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))Function(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))) |
2059− (:\s*((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*))))))) |
2046+ (:\s*((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{[^\{\}]*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[[^\[\]]*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*))))))) |
2060− (:\s*(=>|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(<[^<>]*>)|[^<>(),=])+=\s*(
2047+ (:\s*(=>|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(<[^<>]*>)|[^<>(),=])+=\s*(
2061 ((async\s+)?(
2048 ((async\s+)?(
2062 (function\s*[(<*]) |
2049 (function\s*[(<*]) |
2063 (function\s+) |
2050 (function\s+) |
2064 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
2051 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
2065 )) |
2052 )) |
2066 ((async\s*)?(
2053 ((async\s*)?(
2067− ((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
2054+ ((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{[^\{\}]*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[[^\[\]]*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
2068 # sure shot arrow functions even if => is on new line
2055 # sure shot arrow functions even if => is on new line
2069 (
2056 (
2070− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
2057+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
2071 [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
2058 [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
2072 (
2059 (
2073 ([)]\s*:) | # ():
2060 ([)]\s*:) | # ():
@@ -2077,9 +2064,9 @@ contexts:
2077
2064
2078 # arrow function possible to detect only with => on same line
2065 # arrow function possible to detect only with => on same line
2079 (
2066 (
2080− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
2067+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
2081− \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
2068+ \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
2082− (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
2069+ (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
2083 \s*=> # arrow operator
2070 \s*=> # arrow operator
2084 )
2071 )
2085 ))
2072 ))
@@ -2090,7 +2077,7 @@ contexts:
2090 3: entity.name.function.ts variable.language.this.ts
2077 3: entity.name.function.ts variable.language.this.ts
2091 4: entity.name.function.ts
2078 4: entity.name.function.ts
2092 5: keyword.operator.optional.ts
2079 5: keyword.operator.optional.ts
2093− - match: '(?x)(?:(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(override|public|private|protected|readonly)\s+)?(?:(\.\.\.)\s*)?(?<!=|:)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(this)|([_$[:alpha:]][_$[:alnum:]]*))(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))\s*(\??)'
2080+ - match: '(?x)(?:(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(public|private|protected|readonly)\s+)?(?:(\.\.\.)\s*)?(?<!=|:)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(this)|([_$[:alpha:]][_$[:alnum:]]*))(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))\s*(\??)'
2094 captures:
2081 captures:
2095 1: storage.modifier.ts
2082 1: storage.modifier.ts
2096 2: keyword.operator.rest.ts
2083 2: keyword.operator.rest.ts
@@ -2150,14 +2137,14 @@ contexts:
2150 pop: true
2137 pop: true
2151 - include: expression
2138 - include: expression
2152 paren-expression-possibly-arrow:
2139 paren-expression-possibly-arrow:
2153− - match: '(?<=[(=,])\s*(async)?(?=\s*((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*))?\(\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))'
2140+ - match: '(?<=[(=,])\s*(async)?(?=\s*((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*))?\(\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{[^\{\}]*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[[^\[\]]*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))'
2154 captures:
2141 captures:
2155 1: storage.modifier.async.ts
2142 1: storage.modifier.async.ts
2156 push:
2143 push:
2157 - match: (?<=\))
2144 - match: (?<=\))
2158 pop: true
2145 pop: true
2159 - include: paren-expression-possibly-arrow-with-typeparameters
2146 - include: paren-expression-possibly-arrow-with-typeparameters
2160− - match: '(?<=[(=,]|=>|^return|[^\._$[:alnum:]]return)\s*(async)?(?=\s*((((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*))?\()|(<))\s*$)'
2147+ - match: '(?<=[(=,]|=>|^return|[^\._$[:alnum:]]return)\s*(async)?(?=\s*((((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*))?\()|(<))\s*$)'
2161 captures:
2148 captures:
2162 1: storage.modifier.async.ts
2149 1: storage.modifier.async.ts
2163 push:
2150 push:
@@ -2177,7 +2164,7 @@ contexts:
2177 pop: true
2164 pop: true
2178 - include: expression-inside-possibly-arrow-parens
2165 - include: expression-inside-possibly-arrow-parens
2179 possibly-arrow-return-type:
2166 possibly-arrow-return-type:
2180− - match: '(?<=\)|^)\s*(:)(?=\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*=>)'
2167+ - match: '(?<=\)|^)\s*(:)(?=\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*=>)'
2181 captures:
2168 captures:
2182 1: meta.arrow.ts meta.return.type.arrow.ts keyword.operator.type.annotation.ts
2169 1: meta.arrow.ts meta.return.type.arrow.ts keyword.operator.type.annotation.ts
2183 push:
2170 push:
@@ -2224,23 +2211,23 @@ contexts:
2224 pop: true
2211 pop: true
2225 - include: string-character-escape
2212 - include: string-character-escape
2226 regex:
2213 regex:
2227− - match: '(?<!\+\+|--|})(?<=[=(:,\[?+!]|^return|[^\._$[:alnum:]]return|^case|[^\._$[:alnum:]]case|=>|&&|\|\||\*\/)\s*(\/)(?![\/*])(?=(?:[^\/\\\[\()]|\\.|\[([^\]\\]|\\.)+\]|\(([^\)\\]|\\.)+\))+\/([dgimsuy]+|(?![\/\*])|(?=\/\*))(?!\s*[a-zA-Z0-9_$]))'
2214+ - match: '(?<!\+\+|--|})(?<=[=(:,\[?+!]|^return|[^\._$[:alnum:]]return|^case|[^\._$[:alnum:]]case|=>|&&|\|\||\*\/)\s*(\/)(?![\/*])(?=(?:[^\/\\\[\()]|\\.|\[([^\]\\]|\\.)+\]|\(([^\)\\]|\\.)+\))+\/([gimsuy]+|(?![\/\*])|(?=\/\*))(?!\s*[a-zA-Z0-9_$]))'
2228 captures:
2215 captures:
2229 1: punctuation.definition.string.begin.ts
2216 1: punctuation.definition.string.begin.ts
2230 push:
2217 push:
2231 - meta_scope: string.regexp.ts
2218 - meta_scope: string.regexp.ts
2232− - match: "(/)([dgimsuy]*)"
2219+ - match: "(/)([gimsuy]*)"
2233 captures:
2220 captures:
2234 1: punctuation.definition.string.end.ts
2221 1: punctuation.definition.string.end.ts
2235 2: keyword.other.ts
2222 2: keyword.other.ts
2236 pop: true
2223 pop: true
2237 - include: regexp
2224 - include: regexp
2238− - match: '((?<![_$[:alnum:])\]]|\+\+|--|}|\*\/)|((?<=^return|[^\._$[:alnum:]]return|^case|[^\._$[:alnum:]]case))\s*)\/(?![\/*])(?=(?:[^\/\\\[]|\\.|\[([^\]\\]|\\.)*\])+\/([dgimsuy]+|(?![\/\*])|(?=\/\*))(?!\s*[a-zA-Z0-9_$]))'
2225+ - match: '((?<![_$[:alnum:])\]]|\+\+|--|}|\*\/)|((?<=^return|[^\._$[:alnum:]]return|^case|[^\._$[:alnum:]]case))\s*)\/(?![\/*])(?=(?:[^\/\\\[]|\\.|\[([^\]\\]|\\.)+\])+\/([gimsuy]+|(?![\/\*])|(?=\/\*))(?!\s*[a-zA-Z0-9_$]))'
2239 captures:
2226 captures:
2240 0: punctuation.definition.string.begin.ts
2227 0: punctuation.definition.string.begin.ts
2241 push:
2228 push:
2242 - meta_scope: string.regexp.ts
2229 - meta_scope: string.regexp.ts
2243− - match: "(/)([dgimsuy]*)"
2230+ - match: "(/)([gimsuy]*)"
2244 captures:
2231 captures:
2245 1: punctuation.definition.string.end.ts
2232 1: punctuation.definition.string.end.ts
2246 2: keyword.other.ts
2233 2: keyword.other.ts
@@ -2443,7 +2430,7 @@ contexts:
2443 4: support.variable.property.target.ts
2430 4: support.variable.property.target.ts
2444 - match: |-
2431 - match: |-
2445 (?x) (?:(\.)|(\?\.(?!\s*[[:digit:]]))) \s* (?:
2432 (?x) (?:(\.)|(\?\.(?!\s*[[:digit:]]))) \s* (?:
2446− (?:(constructor|length|prototype|__proto__)\b(?!\$|\s*(<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?\())
2433+ (?:(constructor|length|prototype|__proto__)\b(?!\$|\s*(<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?\())
2447 |
2434 |
2448 (?:(EPSILON|MAX_SAFE_INTEGER|MAX_VALUE|MIN_SAFE_INTEGER|MIN_VALUE|NEGATIVE_INFINITY|POSITIVE_INFINITY)\b(?!\$)))
2435 (?:(EPSILON|MAX_SAFE_INTEGER|MAX_VALUE|MIN_SAFE_INTEGER|MIN_VALUE|NEGATIVE_INFINITY|POSITIVE_INFINITY)\b(?!\$)))
2449 captures:
2436 captures:
@@ -2549,7 +2536,7 @@ contexts:
2549 |siblingBelow|size|source|specified|standby|start|status|statusbar|statusText|style|styleSheets|suffixes|summary
2536 |siblingBelow|size|source|specified|standby|start|status|statusbar|statusText|style|styleSheets|suffixes|summary
2550 |systemId|systemLanguage|tagName|tags|target|tBodies|text|textAlign|textDecoration|textIndent|textTransform|tFoot|tHead
2537 |systemId|systemLanguage|tagName|tags|target|tBodies|text|textAlign|textDecoration|textIndent|textTransform|tFoot|tHead
2551 |title|toolbar|top|type|undefined|uniqueID|updateInterval|URL|URLUnencoded|useMap|userAgent|userLanguage|userProfile
2538 |title|toolbar|top|type|undefined|uniqueID|updateInterval|URL|URLUnencoded|useMap|userAgent|userLanguage|userProfile
2552− |vAlign|value|valueType|vendor|vendorSub|version|visibility|vspace|whiteSpace|width|X[MS]LDocument|zIndex))\b(?!\$|\s*(<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?\()
2539+ |vAlign|value|valueType|vendor|vendorSub|version|visibility|vspace|whiteSpace|width|X[MS]LDocument|zIndex))\b(?!\$|\s*(<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?\()
2553 captures:
2540 captures:
2554 1: punctuation.accessor.ts
2541 1: punctuation.accessor.ts
2555 2: punctuation.accessor.optional.ts
2542 2: punctuation.accessor.optional.ts
@@ -2716,34 +2703,20 @@ contexts:
2716 0: case-clause.expr.ts punctuation.definition.section.case-statement.ts
2703 0: case-clause.expr.ts punctuation.definition.section.case-statement.ts
2717 - include: statements
2704 - include: statements
2718 template:
2705 template:
2719− - include: template-call
2720− - match: "([_$[:alpha:]][_$[:alnum:]]*)?(`)"
2721− captures:
2722− 1: entity.name.function.tagged-template.ts
2723− 2: punctuation.definition.string.template.begin.ts
2724− push:
2725− - meta_scope: string.template.ts
2726− - match: "`"
2727− captures:
2728− 0: punctuation.definition.string.template.end.ts
2729− pop: true
2730− - include: template-substitution-element
2731− - include: string-character-escape
2732− template-call:
2733− - match: '(?=(([_$[:alpha:]][_$[:alnum:]]*\s*\??\.\s*)*|(\??\.\s*)?)([_$[:alpha:]][_$[:alnum:]]*)(<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))(([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>)*(?<!=)\>))*(?<!=)\>)*(?<!=)>\s*)?`)'
2706+ - match: '(?=(([_$[:alpha:]][_$[:alnum:]]*\s*\??\.\s*)*|(\??\.\s*)?)([_$[:alpha:]][_$[:alnum:]]*)(<\s*(((keyof|infer|awaited|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|awaited|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))(([^<>\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|awaited|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?<==)\>)*(?<!=)\>))*(?<!=)\>)*(?<!=)>\s*)?`)'
2734 push:
2707 push:
2735 - meta_scope: string.template.ts
2708 - meta_scope: string.template.ts
2736 - match: (?=`)
2709 - match: (?=`)
2737 pop: true
2710 pop: true
2738 - match: '(?=(([_$[:alpha:]][_$[:alnum:]]*\s*\??\.\s*)*|(\??\.\s*)?)([_$[:alpha:]][_$[:alnum:]]*))'
2711 - match: '(?=(([_$[:alpha:]][_$[:alnum:]]*\s*\??\.\s*)*|(\??\.\s*)?)([_$[:alpha:]][_$[:alnum:]]*))'
2739 push:
2712 push:
2740− - match: '(?=(<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))(([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>)*(?<!=)\>))*(?<!=)\>)*(?<!=)>\s*)?`)'
2713+ - match: '(?=(<\s*(((keyof|infer|awaited|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|awaited|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))(([^<>\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|awaited|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?<==)\>)*(?<!=)\>))*(?<!=)\>)*(?<!=)>\s*)?`)'
2741 pop: true
2714 pop: true
2742 - include: support-function-call-identifiers
2715 - include: support-function-call-identifiers
2743 - match: "([_$[:alpha:]][_$[:alnum:]]*)"
2716 - match: "([_$[:alpha:]][_$[:alnum:]]*)"
2744 scope: entity.name.function.tagged-template.ts
2717 scope: entity.name.function.tagged-template.ts
2745 - include: type-arguments
2718 - include: type-arguments
2746− - match: '([_$[:alpha:]][_$[:alnum:]]*)?\s*(?=(<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))(([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>)*(?<!=)\>))*(?<!=)\>)*(?<!=)>\s*)`)'
2719+ - match: '([_$[:alpha:]][_$[:alnum:]]*)\s*(?=(<\s*(((keyof|infer|awaited|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|awaited|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))(([^<>\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|awaited|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?<==)\>)*(?<!=)\>))*(?<!=)\>)*(?<!=)>\s*)`)'
2747 captures:
2720 captures:
2748 1: entity.name.function.tagged-template.ts
2721 1: entity.name.function.tagged-template.ts
2749 push:
2722 push:
@@ -2751,20 +2724,6 @@ contexts:
2751 - match: (?=`)
2724 - match: (?=`)
2752 pop: true
2725 pop: true
2753 - include: type-arguments
2726 - include: type-arguments
2754− template-substitution-element:
2755− - match: '\$\{'
2756− captures:
2757− 0: punctuation.definition.template-expression.begin.ts
2758− push:
2759− - meta_scope: meta.template.expression.ts
2760− - meta_content_scope: meta.embedded.line.ts
2761− - match: '\}'
2762− captures:
2763− 0: punctuation.definition.template-expression.end.ts
2764− pop: true
2765− - include: expression
2766− template-type:
2767− - include: template-call
2768 - match: "([_$[:alpha:]][_$[:alnum:]]*)?(`)"
2727 - match: "([_$[:alpha:]][_$[:alnum:]]*)?(`)"
2769 captures:
2728 captures:
2770 1: entity.name.function.tagged-template.ts
2729 1: entity.name.function.tagged-template.ts
@@ -2775,9 +2734,9 @@ contexts:
2775 captures:
2734 captures:
2776 0: punctuation.definition.string.template.end.ts
2735 0: punctuation.definition.string.template.end.ts
2777 pop: true
2736 pop: true
2778− - include: template-type-substitution-element
2737+ - include: template-substitution-element
2779 - include: string-character-escape
2738 - include: string-character-escape
2780− template-type-substitution-element:
2739+ template-substitution-element:
2781 - match: '\$\{'
2740 - match: '\$\{'
2782 captures:
2741 captures:
2783 0: punctuation.definition.template-expression.begin.ts
2742 0: punctuation.definition.template-expression.begin.ts
@@ -2788,7 +2747,7 @@ contexts:
2788 captures:
2747 captures:
2789 0: punctuation.definition.template-expression.end.ts
2748 0: punctuation.definition.template-expression.end.ts
2790 pop: true
2749 pop: true
2791− - include: type
2750+ - include: expression
2792 ternary-expression:
2751 ternary-expression:
2793 - match: '(?!\?\.\s*[^[:digit:]])(\?)(?!\?)'
2752 - match: '(?!\?\.\s*[^[:digit:]])(\?)(?!\?)'
2794 captures:
2753 captures:
@@ -2804,7 +2763,7 @@ contexts:
2804 scope: variable.language.this.ts
2763 scope: variable.language.this.ts
2805 type:
2764 type:
2806 - include: comment
2765 - include: comment
2807− - include: type-string
2766+ - include: string
2808 - include: numeric-literal
2767 - include: numeric-literal
2809 - include: type-primitive
2768 - include: type-primitive
2810 - include: type-builtin-literals
2769 - include: type-builtin-literals
@@ -2829,23 +2788,15 @@ contexts:
2829 4: entity.name.type.alias.ts
2788 4: entity.name.type.alias.ts
2830 push:
2789 push:
2831 - meta_scope: meta.type.declaration.ts
2790 - meta_scope: meta.type.declaration.ts
2832− - match: '(?=\}|;|^\s*$|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))'
2791+ - match: '(?=\}|;|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))'
2833 pop: true
2792 pop: true
2834 - include: comment
2793 - include: comment
2835 - include: type-parameters
2794 - include: type-parameters
2836− - match: '(=)\s*(intrinsic)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
2837− captures:
2838− 1: keyword.operator.assignment.ts
2839− 2: keyword.control.intrinsic.ts
2840− push:
2841− - match: '(?=\}|;|^\s*$|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))'
2842− pop: true
2843− - include: type
2844 - match: (=)\s*
2795 - match: (=)\s*
2845 captures:
2796 captures:
2846 1: keyword.operator.assignment.ts
2797 1: keyword.operator.assignment.ts
2847 push:
2798 push:
2848− - match: '(?=\}|;|^\s*$|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))'
2799+ - match: '(?=\}|;|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))'
2849 pop: true
2800 pop: true
2850 - include: type
2801 - include: type
2851 type-annotation:
2802 type-annotation:
@@ -2903,19 +2854,17 @@ contexts:
2903 - include: type
2854 - include: type
2904 - include: type
2855 - include: type
2905 type-fn-type-parameters:
2856 type-fn-type-parameters:
2906− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(abstract)\s+)?(new)\b(?=\s*\<)'
2857+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(new)\b(?=\s*\<)'
2907 captures:
2858 captures:
2908− 1: meta.type.constructor.ts storage.modifier.ts
2859+ 1: meta.type.constructor.ts keyword.control.new.ts
2909− 2: meta.type.constructor.ts keyword.control.new.ts
2910 push:
2860 push:
2911 - match: (?<=>)
2861 - match: (?<=>)
2912 pop: true
2862 pop: true
2913 - include: comment
2863 - include: comment
2914 - include: type-parameters
2864 - include: type-parameters
2915− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(abstract)\s+)?(new)\b\s*(?=\()'
2865+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(new)\b\s*(?=\()'
2916 captures:
2866 captures:
2917− 1: storage.modifier.ts
2918− 2: keyword.control.new.ts
2867+ 1: keyword.control.new.ts
2919 push:
2868 push:
2920 - meta_scope: meta.type.constructor.ts
2869 - meta_scope: meta.type.constructor.ts
2921 - match: (?<=\))
2870 - match: (?<=\))
@@ -3044,6 +2993,8 @@ contexts:
3044 scope: keyword.operator.ternary.ts
2993 scope: keyword.operator.ternary.ts
3045 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))infer(?=\s+[_$[:alpha:]])'
2994 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))infer(?=\s+[_$[:alpha:]])'
3046 scope: keyword.operator.expression.infer.ts
2995 scope: keyword.operator.expression.infer.ts
2996+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))awaited(?=\s+[_$[:alpha:]])'
2997+ scope: keyword.operator.expression.awaited.ts
3047 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))import(?=\s*\()'
2998 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))import(?=\s*\()'
3048 scope: keyword.operator.expression.import.ts
2999 scope: keyword.operator.expression.import.ts
3049 type-parameters:
3000 type-parameters:
@@ -3086,7 +3037,7 @@ contexts:
3086 ))
3037 ))
3087 )) |
3038 )) |
3088 (:\s*(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))Function(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))) |
3039 (:\s*(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))Function(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))) |
3089− (:\s*((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*))))))))
3040+ (:\s*((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{[^\{\}]*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[[^\[\]]*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*))))))))
3090 captures:
3041 captures:
3091 1: storage.modifier.ts
3042 1: storage.modifier.ts
3092 2: keyword.operator.rest.ts
3043 2: keyword.operator.rest.ts
@@ -3123,10 +3074,6 @@ contexts:
3123 type-primitive:
3074 type-primitive:
3124 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(string|number|bigint|boolean|symbol|any|void|never|unknown)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
3075 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(string|number|bigint|boolean|symbol|any|void|never|unknown)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
3125 scope: support.type.primitive.ts
3076 scope: support.type.primitive.ts
3126− type-string:
3127− - include: qstring-single
3128− - include: qstring-double
3129− - include: template-type
3130 type-tuple:
3077 type-tuple:
3131 - match: '\['
3078 - match: '\['
3132 captures:
3079 captures:
@@ -3148,12 +3095,7 @@ contexts:
3148 - include: punctuation-comma
3095 - include: punctuation-comma
3149 typeof-operator:
3096 typeof-operator:
3150 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))typeof(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
3097 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))typeof(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
3151− captures:
3152− 0: keyword.operator.expression.typeof.ts
3098+ scope: keyword.operator.expression.typeof.ts
3153− push:
3154− - match: '(?=[,);}\]=>:&|{\?]|$|;|^\s*$|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))'
3155− pop: true
3156− - include: expression
3157 undefined-literal:
3099 undefined-literal:
3158 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))undefined(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
3100 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))undefined(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
3159 scope: constant.language.undefined.ts
3101 scope: constant.language.undefined.ts
@@ -3161,7 +3103,7 @@ contexts:
3161 - match: '(?=(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(var|let)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.)))'
3103 - match: '(?=(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(var|let)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.)))'
3162 push:
3104 push:
3163 - meta_scope: meta.var.expr.ts
3105 - meta_scope: meta.var.expr.ts
3164− - match: '(?!(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(var|let)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.)))((?=;|}|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(of|in)\s+)|;|^\s*$|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))|((?<!^let|[^\._$[:alnum:]]let|^var|[^\._$[:alnum:]]var)(?=\s*$)))'
3106+ - match: '(?!(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(var|let)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.)))((?=;|}|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(of|in)\s+)|^\s*$|;|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))|((?<!^let|[^\._$[:alnum:]]let|^var|[^\._$[:alnum:]]var)(?=\s*$)))'
3165 pop: true
3107 pop: true
3166 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(var|let)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))\s*'
3108 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(var|let)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))\s*'
3167 captures:
3109 captures:
@@ -3194,7 +3136,7 @@ contexts:
3194 3: storage.type.ts
3136 3: storage.type.ts
3195 push:
3137 push:
3196 - meta_scope: meta.var.expr.ts
3138 - meta_scope: meta.var.expr.ts
3197− - match: '(?!(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(const(?!\s+enum\b))(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.)))((?=;|}|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(of|in)\s+)|;|^\s*$|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))|((?<!^const|[^\._$[:alnum:]]const)(?=\s*$)))'
3139+ - match: '(?!(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(const(?!\s+enum\b))(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.)))((?=;|}|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(of|in)\s+)|^\s*$|;|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))|((?<!^const|[^\._$[:alnum:]]const)(?=\s*$)))'
3198 pop: true
3140 pop: true
3199 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(const(?!\s+enum\b))(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))\s*'
3141 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(const(?!\s+enum\b))(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))\s*'
3200 captures:
3142 captures:
@@ -3231,10 +3173,10 @@ contexts:
3231 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
3173 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
3232 )) |
3174 )) |
3233 ((async\s*)?(
3175 ((async\s*)?(
3234− ((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
3176+ ((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{[^\{\}]*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[[^\[\]]*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
3235 # sure shot arrow functions even if => is on new line
3177 # sure shot arrow functions even if => is on new line
3236 (
3178 (
3237− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
3179+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
3238 [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
3180 [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
3239 (
3181 (
3240 ([)]\s*:) | # ():
3182 ([)]\s*:) | # ():
@@ -3244,9 +3186,9 @@ contexts:
3244
3186
3245 # arrow function possible to detect only with => on same line
3187 # arrow function possible to detect only with => on same line
3246 (
3188 (
3247− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
3189+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
3248− \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
3190+ \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
3249− (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
3191+ (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
3250 \s*=> # arrow operator
3192 \s*=> # arrow operator
3251 )
3193 )
3252 ))
3194 ))
@@ -3264,18 +3206,18 @@ contexts:
3264 ))
3206 ))
3265 )) |
3207 )) |
3266 (:\s*(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))Function(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))) |
3208 (:\s*(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))Function(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))) |
3267− (:\s*((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*))))))) |
3209+ (:\s*((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{[^\{\}]*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[[^\[\]]*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*))))))) |
3268− (:\s*(=>|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(<[^<>]*>)|[^<>(),=])+=\s*(
3210+ (:\s*(=>|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(<[^<>]*>)|[^<>(),=])+=\s*(
3269 ((async\s+)?(
3211 ((async\s+)?(
3270 (function\s*[(<*]) |
3212 (function\s*[(<*]) |
3271 (function\s+) |
3213 (function\s+) |
3272 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
3214 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
3273 )) |
3215 )) |
3274 ((async\s*)?(
3216 ((async\s*)?(
3275− ((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
3217+ ((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{[^\{\}]*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[[^\[\]]*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
3276 # sure shot arrow functions even if => is on new line
3218 # sure shot arrow functions even if => is on new line
3277 (
3219 (
3278− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
3220+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
3279 [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
3221 [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
3280 (
3222 (
3281 ([)]\s*:) | # ():
3223 ([)]\s*:) | # ():
@@ -3285,9 +3227,9 @@ contexts:
3285
3227
3286 # arrow function possible to detect only with => on same line
3228 # arrow function possible to detect only with => on same line
3287 (
3229 (
3288− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
3230+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
3289− \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
3231+ \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
3290− (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
3232+ (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
3291 \s*=> # arrow operator
3233 \s*=> # arrow operator
3292 )
3234 )
3293 ))
3235 ))
@@ -3318,10 +3260,10 @@ contexts:
3318 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
3260 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
3319 )) |
3261 )) |
3320 ((async\s*)?(
3262 ((async\s*)?(
3321− ((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
3263+ ((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{[^\{\}]*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[[^\[\]]*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
3322 # sure shot arrow functions even if => is on new line
3264 # sure shot arrow functions even if => is on new line
3323 (
3265 (
3324− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
3266+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
3325 [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
3267 [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
3326 (
3268 (
3327 ([)]\s*:) | # ():
3269 ([)]\s*:) | # ():
@@ -3331,9 +3273,9 @@ contexts:
3331
3273
3332 # arrow function possible to detect only with => on same line
3274 # arrow function possible to detect only with => on same line
3333 (
3275 (
3334− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
3276+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
3335− \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
3277+ \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
3336− (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
3278+ (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
3337 \s*=> # arrow operator
3279 \s*=> # arrow operator
3338 )
3280 )
3339 ))
3281 ))
@@ -3351,18 +3293,18 @@ contexts:
3351 ))
3293 ))
3352 )) |
3294 )) |
3353 (:\s*(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))Function(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))) |
3295 (:\s*(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))Function(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))) |
3354− (:\s*((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*))))))) |
3296+ (:\s*((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{[^\{\}]*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[[^\[\]]*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*))))))) |
3355− (:\s*(=>|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(<[^<>]*>)|[^<>(),=])+=\s*(
3297+ (:\s*(=>|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(<[^<>]*>)|[^<>(),=])+=\s*(
3356 ((async\s+)?(
3298 ((async\s+)?(
3357 (function\s*[(<*]) |
3299 (function\s*[(<*]) |
3358 (function\s+) |
3300 (function\s+) |
3359 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
3301 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
3360 )) |
3302 )) |
3361 ((async\s*)?(
3303 ((async\s*)?(
3362− ((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
3304+ ((<\s*$)|((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?[\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{[^\{\}]*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[[^\[\]]*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
3363 # sure shot arrow functions even if => is on new line
3305 # sure shot arrow functions even if => is on new line
3364 (
3306 (
3365− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
3307+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
3366 [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
3308 [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
3367 (
3309 (
3368 ([)]\s*:) | # ():
3310 ([)]\s*:) | # ():
@@ -3372,9 +3314,9 @@ contexts:
3372
3314
3373 # arrow function possible to detect only with => on same line
3315 # arrow function possible to detect only with => on same line
3374 (
3316 (
3375− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
3317+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
3376− \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
3318+ \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
3377− (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
3319+ (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<[^<>]+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
3378 \s*=> # arrow operator
3320 \s*=> # arrow operator
3379 )
3321 )
3380 ))
3322 ))
assets/syntaxes/02_Extra/TypsecriptReact.sublime-syntax+477−896
@@ -9,7 +9,10 @@ contexts:
9 main:
9 main:
10 - include: directives
10 - include: directives
11 - include: statements
11 - include: statements
12− - include: shebang
12+ - match: \A(#!).*(?=$)
13+ scope: comment.line.shebang.ts
14+ captures:
15+ 1: punctuation.definition.comment.ts
13 comment:
16 comment:
14 - match: /\*\*(?!/)
17 - match: /\*\*(?!/)
15 captures:
18 captures:
@@ -41,10 +44,10 @@ contexts:
41 5: punctuation.decorator.internaldeclaration.tsx
44 5: punctuation.decorator.internaldeclaration.tsx
42 push:
45 push:
43 - meta_content_scope: comment.line.double-slash.tsx
46 - meta_content_scope: comment.line.double-slash.tsx
44− - match: (?=$)
47+ - match: (?=^)
45 pop: true
48 pop: true
46 access-modifier:
49 access-modifier:
47− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(abstract|declare|override|public|protected|private|readonly|static)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
50+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(abstract|public|protected|private|readonly|static)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
48 scope: storage.modifier.tsx
51 scope: storage.modifier.tsx
49 after-operator-block-as-object-literal:
52 after-operator-block-as-object-literal:
50 - match: '(?<!\+\+|--)(?<=[:=(,\[?+!>]|^await|[^\._$[:alnum:]]await|^return|[^\._$[:alnum:]]return|^yield|[^\._$[:alnum:]]yield|^throw|[^\._$[:alnum:]]throw|^in|[^\._$[:alnum:]]in|^of|[^\._$[:alnum:]]of|^typeof|[^\._$[:alnum:]]typeof|&&|\|\||\*)\s*(\{)'
53 - match: '(?<!\+\+|--)(?<=[:=(,\[?+!>]|^await|[^\._$[:alnum:]]await|^return|[^\._$[:alnum:]]return|^yield|[^\._$[:alnum:]]yield|^throw|[^\._$[:alnum:]]throw|^in|[^\._$[:alnum:]]in|^of|[^\._$[:alnum:]]of|^typeof|[^\._$[:alnum:]]typeof|&&|\|\||\*)\s*(\{)'
@@ -106,8 +109,8 @@ contexts:
106 (?=
109 (?=
107 # sure shot arrow functions even if => is on new line
110 # sure shot arrow functions even if => is on new line
108 (
111 (
109− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
112+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*>\s*)?
110− [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
113+ [(]\s*
111 (
114 (
112 ([)]\s*:) | # ():
115 ([)]\s*:) | # ():
113 ((\.\.\.\s*)?[_$[:alpha:]][_$[:alnum:]]*\s*:) # [(]param: | [(]...param:
116 ((\.\.\.\s*)?[_$[:alpha:]][_$[:alnum:]]*\s*:) # [(]param: | [(]...param:
@@ -118,9 +121,9 @@ contexts:
118 ) |
121 ) |
119 # arrow function possible to detect only with => on same line
122 # arrow function possible to detect only with => on same line
120 (
123 (
121− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
124+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*>\s*)? # typeparameters
122− \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
125+ \(\s*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()]|(\(([^\(\)]|(\([^\(\)]*\)))*\)))*)?\) # parameters
123− (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
126+ (\s*:\s*([^<>\(\)]|\<[^<>]+\>|\([^\(\)]+\))+)? # return type
124 \s*=> # arrow operator
127 \s*=> # arrow operator
125 )
128 )
126 )
129 )
@@ -135,15 +138,13 @@ contexts:
135 - include: type-parameters
138 - include: type-parameters
136 - include: function-parameters
139 - include: function-parameters
137 - include: arrow-return-type
140 - include: arrow-return-type
138− - include: possibly-arrow-return-type
139 - match: "=>"
141 - match: "=>"
140 captures:
142 captures:
141 0: storage.type.function.arrow.tsx
143 0: storage.type.function.arrow.tsx
142 push:
144 push:
143 - meta_scope: meta.arrow.tsx
145 - meta_scope: meta.arrow.tsx
144− - match: '((?<=\}|\S)(?<!=>)|((?!\{)(?=\S)))(?!\/[\/\*])'
146+ - match: '(?<=\}|\S)(?<!=>)|((?!\{)(?=\S))'
145 pop: true
147 pop: true
146− - include: single-line-comment-consuming-line-ending
147 - include: decl-block
148 - include: decl-block
148 - include: expression
149 - include: expression
149 arrow-return-type:
150 arrow-return-type:
@@ -169,8 +170,6 @@ contexts:
169 binding-element:
170 binding-element:
170 - include: comment
171 - include: comment
171 - include: string
172 - include: string
172− - include: numeric-literal
173− - include: regex
174 - include: object-binding-pattern
173 - include: object-binding-pattern
175 - include: array-binding-pattern
174 - include: array-binding-pattern
176 - include: destructuring-variable-rest
175 - include: destructuring-variable-rest
@@ -178,8 +177,6 @@ contexts:
178 binding-element-const:
177 binding-element-const:
179 - include: comment
178 - include: comment
180 - include: string
179 - include: string
181− - include: numeric-literal
182− - include: regex
183 - include: object-binding-pattern-const
180 - include: object-binding-pattern-const
184 - include: array-binding-pattern-const
181 - include: array-binding-pattern-const
185 - include: destructuring-variable-rest-const
182 - include: destructuring-variable-rest-const
@@ -203,12 +200,11 @@ contexts:
203 cast:
200 cast:
204 - include: jsx
201 - include: jsx
205 class-declaration:
202 class-declaration:
206− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(?:(abstract)\s+)?\b(class)\b(?=\s+|/[/*])'
203+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(export)\s+)?\b(?:(abstract)\s+)?\b(class)\b(?=\s+|/[/*])'
207 captures:
204 captures:
208 1: keyword.control.export.tsx
205 1: keyword.control.export.tsx
209 2: storage.modifier.tsx
206 2: storage.modifier.tsx
210− 3: storage.modifier.tsx
207+ 3: storage.type.class.tsx
211− 4: storage.type.class.tsx
212 push:
208 push:
213 - meta_scope: meta.class.tsx
209 - meta_scope: meta.class.tsx
214 - match: '(?<=\})'
210 - match: '(?<=\})'
@@ -223,10 +219,9 @@ contexts:
223 - include: type-parameters
219 - include: type-parameters
224 - include: class-or-interface-body
220 - include: class-or-interface-body
225 class-expression:
221 class-expression:
226− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(abstract)\s+)?(class)\b(?=\s+|[<{]|\/[\/*])'
222+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(class)\b(?=\s+|[<{]|\/[\/*])'
227 captures:
223 captures:
228− 1: storage.modifier.tsx
224+ 1: storage.type.class.tsx
229− 2: storage.type.class.tsx
230 push:
225 push:
231 - meta_scope: meta.class.tsx
226 - meta_scope: meta.class.tsx
232 - match: '(?<=\})'
227 - match: '(?<=\})'
@@ -243,11 +238,6 @@ contexts:
243 pop: true
238 pop: true
244 - include: comment
239 - include: comment
245 - include: decorator
240 - include: decorator
246− - match: (?<=:)\s*
247− push:
248− - match: '(?=\s|[;),}\]:\-\+]|;|^\s*$|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))'
249− pop: true
250− - include: expression
251 - include: method-declaration
241 - include: method-declaration
252 - include: indexer-declaration
242 - include: indexer-declaration
253 - include: field-declaration
243 - include: field-declaration
@@ -294,15 +284,9 @@ contexts:
294 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(break|continue|do|goto|while)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
284 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(break|continue|do|goto|while)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
295 scope: keyword.control.loop.tsx
285 scope: keyword.control.loop.tsx
296 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(return)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
286 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(return)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
297− captures:
287+ scope: keyword.control.flow.tsx
298− 0: keyword.control.flow.tsx
299− push:
300− - match: '(?=[;}]|$|;|^\s*$|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))'
301− pop: true
302− - include: expression
303 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(case|default|switch)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
288 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(case|default|switch)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
304 scope: keyword.control.switch.tsx
289 scope: keyword.control.switch.tsx
305− - include: if-statement
306 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(else|if)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
290 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(else|if)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
307 scope: keyword.control.conditional.tsx
291 scope: keyword.control.conditional.tsx
308 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(with)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
292 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(with)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
@@ -311,6 +295,8 @@ contexts:
311 scope: keyword.control.tsx
295 scope: keyword.control.tsx
312 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(debugger)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
296 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(debugger)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
313 scope: keyword.other.debugger.tsx
297 scope: keyword.other.debugger.tsx
298+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(declare)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
299+ scope: storage.modifier.tsx
314 decl-block:
300 decl-block:
315 - match: '\{'
301 - match: '\{'
316 captures:
302 captures:
@@ -334,8 +320,6 @@ contexts:
334 - include: import-equals-declaration
320 - include: import-equals-declaration
335 - include: import-declaration
321 - include: import-declaration
336 - include: export-declaration
322 - include: export-declaration
337− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(declare|export)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
338− scope: storage.modifier.tsx
339 decorator:
323 decorator:
340 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))\@'
324 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))\@'
341 captures:
325 captures:
@@ -349,7 +333,7 @@ contexts:
349 - match: '(?<!=|:|^of|[^\._$[:alnum:]]of|^in|[^\._$[:alnum:]]in)\s*(?=\{)'
333 - match: '(?<!=|:|^of|[^\._$[:alnum:]]of|^in|[^\._$[:alnum:]]in)\s*(?=\{)'
350 push:
334 push:
351 - meta_scope: meta.object-binding-pattern-variable.tsx
335 - meta_scope: meta.object-binding-pattern-variable.tsx
352− - match: '(?=$|^|[;,=}]|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(of|in)\s+))'
336+ - match: '(?=$|^|[;,=}]|(\s+(of|in)\s+))'
353 pop: true
337 pop: true
354 - include: object-binding-pattern-const
338 - include: object-binding-pattern-const
355 - include: type-annotation
339 - include: type-annotation
@@ -357,16 +341,15 @@ contexts:
357 - match: '(?<!=|:|^of|[^\._$[:alnum:]]of|^in|[^\._$[:alnum:]]in)\s*(?=\[)'
341 - match: '(?<!=|:|^of|[^\._$[:alnum:]]of|^in|[^\._$[:alnum:]]in)\s*(?=\[)'
358 push:
342 push:
359 - meta_scope: meta.array-binding-pattern-variable.tsx
343 - meta_scope: meta.array-binding-pattern-variable.tsx
360− - match: '(?=$|^|[;,=}]|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(of|in)\s+))'
344+ - match: '(?=$|^|[;,=}]|(\s+(of|in)\s+))'
361 pop: true
345 pop: true
362 - include: array-binding-pattern-const
346 - include: array-binding-pattern-const
363 - include: type-annotation
347 - include: type-annotation
364 - include: comment
348 - include: comment
365 destructuring-parameter:
349 destructuring-parameter:
366− - match: '(?<!=|:)\s*(?:(\.\.\.)\s*)?(\{)'
350+ - match: '(?<!=|:)\s*(\{)'
367 captures:
351 captures:
368− 1: keyword.operator.rest.tsx
352+ 1: punctuation.definition.binding-pattern.object.tsx
369− 2: punctuation.definition.binding-pattern.object.tsx
370 push:
353 push:
371 - meta_scope: meta.parameter.object-binding-pattern.tsx
354 - meta_scope: meta.parameter.object-binding-pattern.tsx
372 - match: '\}'
355 - match: '\}'
@@ -374,10 +357,9 @@ contexts:
374 0: punctuation.definition.binding-pattern.object.tsx
357 0: punctuation.definition.binding-pattern.object.tsx
375 pop: true
358 pop: true
376 - include: parameter-object-binding-element
359 - include: parameter-object-binding-element
377− - match: '(?<!=|:)\s*(?:(\.\.\.)\s*)?(\[)'
360+ - match: '(?<!=|:)\s*(\[)'
378 captures:
361 captures:
379− 1: keyword.operator.rest.tsx
362+ 1: punctuation.definition.binding-pattern.array.tsx
380− 2: punctuation.definition.binding-pattern.array.tsx
381 push:
363 push:
382 - meta_scope: meta.paramter.array-binding-pattern.tsx
364 - meta_scope: meta.paramter.array-binding-pattern.tsx
383 - match: '\]'
365 - match: '\]'
@@ -395,7 +377,7 @@ contexts:
395 - match: '(?<!=|:|^of|[^\._$[:alnum:]]of|^in|[^\._$[:alnum:]]in)\s*(?=\{)'
377 - match: '(?<!=|:|^of|[^\._$[:alnum:]]of|^in|[^\._$[:alnum:]]in)\s*(?=\{)'
396 push:
378 push:
397 - meta_scope: meta.object-binding-pattern-variable.tsx
379 - meta_scope: meta.object-binding-pattern-variable.tsx
398− - match: '(?=$|^|[;,=}]|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(of|in)\s+))'
380+ - match: '(?=$|^|[;,=}]|(\s+(of|in)\s+))'
399 pop: true
381 pop: true
400 - include: object-binding-pattern
382 - include: object-binding-pattern
401 - include: type-annotation
383 - include: type-annotation
@@ -403,7 +385,7 @@ contexts:
403 - match: '(?<!=|:|^of|[^\._$[:alnum:]]of|^in|[^\._$[:alnum:]]in)\s*(?=\[)'
385 - match: '(?<!=|:|^of|[^\._$[:alnum:]]of|^in|[^\._$[:alnum:]]in)\s*(?=\[)'
404 push:
386 push:
405 - meta_scope: meta.array-binding-pattern-variable.tsx
387 - meta_scope: meta.array-binding-pattern-variable.tsx
406− - match: '(?=$|^|[;,=}]|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(of|in)\s+))'
388+ - match: '(?=$|^|[;,=}]|(\s+(of|in)\s+))'
407 pop: true
389 pop: true
408 - include: array-binding-pattern
390 - include: array-binding-pattern
409 - include: type-annotation
391 - include: type-annotation
@@ -419,12 +401,12 @@ contexts:
419 1: keyword.operator.rest.tsx
401 1: keyword.operator.rest.tsx
420 2: meta.definition.variable.tsx variable.other.constant.tsx
402 2: meta.definition.variable.tsx variable.other.constant.tsx
421 directives:
403 directives:
422− - match: '^(///)\s*(?=<(reference|amd-dependency|amd-module)(\s+(path|types|no-default-lib|lib|name)\s*=\s*((\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`)))+\s*/>\s*$)'
404+ - match: '^(///)\s*(?=<(reference|amd-dependency|amd-module)(\s+(path|types|no-default-lib|lib|name)\s*=\s*((\''([^\''\\]|\\\''|\\)*\'')|(\"([^\"\\]|\\\"|\\)*\")))+\s*/>\s*$)'
423 captures:
405 captures:
424 1: punctuation.definition.comment.tsx
406 1: punctuation.definition.comment.tsx
425 push:
407 push:
426 - meta_scope: comment.line.triple-slash.directive.tsx
408 - meta_scope: comment.line.triple-slash.directive.tsx
427− - match: (?=$)
409+ - match: (?=^)
428 pop: true
410 pop: true
429 - match: (<)(reference|amd-dependency|amd-module)
411 - match: (<)(reference|amd-dependency|amd-module)
430 captures:
412 captures:
@@ -686,18 +668,13 @@ contexts:
686 captures:
668 captures:
687 1: punctuation.definition.block.tag.jsdoc
669 1: punctuation.definition.block.tag.jsdoc
688 - include: inline-tags
670 - include: inline-tags
689− - match: '((@)(?:[_$[:alpha:]][_$[:alnum:]]*))(?=\s+)'
690− captures:
691− 1: storage.type.class.jsdoc
692− 2: punctuation.definition.block.tag.jsdoc
693 enum-declaration:
671 enum-declaration:
694− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?(?:\b(const)\s+)?\b(enum)\s+([_$[:alpha:]][_$[:alnum:]]*)'
672+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:\b(const)\s+)?\b(enum)\s+([_$[:alpha:]][_$[:alnum:]]*)'
695 captures:
673 captures:
696 1: keyword.control.export.tsx
674 1: keyword.control.export.tsx
697 2: storage.modifier.tsx
675 2: storage.modifier.tsx
698− 3: storage.modifier.tsx
676+ 3: storage.type.enum.tsx
699− 4: storage.type.enum.tsx
677+ 4: entity.name.type.enum.tsx
700− 5: entity.name.type.enum.tsx
701 push:
678 push:
702 - meta_scope: meta.enum.declaration.tsx
679 - meta_scope: meta.enum.declaration.tsx
703 - match: '(?<=\})'
680 - match: '(?<=\})'
@@ -720,7 +697,7 @@ contexts:
720 pop: true
697 pop: true
721 - include: comment
698 - include: comment
722 - include: variable-initializer
699 - include: variable-initializer
723− - match: '(?=((\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`)|(\[([^\[\]]|\[[^\[\]]*\])+\])))'
700+ - match: '(?=((\''([^\''\\]|\\\''|\\)*\'')|(\"([^\"\\]|\\\"|\\)*\")|(\[([^\[\]]|\[[^\[\]]*\])+\])))'
724 push:
701 push:
725 - match: '(?=,|\}|$)'
702 - match: '(?=,|\}|$)'
726 pop: true
703 pop: true
@@ -736,25 +713,22 @@ contexts:
736 2: keyword.control.as.tsx
713 2: keyword.control.as.tsx
737 3: storage.type.namespace.tsx
714 3: storage.type.namespace.tsx
738 4: entity.name.type.module.tsx
715 4: entity.name.type.module.tsx
739− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(export)(?:\s+(type))?(?:(?:\s*(=))|(?:\s+(default)(?=\s+)))'
716+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(export)(?:(?:\s*(=))|(?:\s+(default)(?=\s+)))'
740 captures:
717 captures:
741 1: keyword.control.export.tsx
718 1: keyword.control.export.tsx
742− 2: keyword.control.type.tsx
719+ 2: keyword.operator.assignment.tsx
743− 3: keyword.operator.assignment.tsx
720+ 3: keyword.control.default.tsx
744− 4: keyword.control.default.tsx
745 push:
721 push:
746 - meta_scope: meta.export.default.tsx
722 - meta_scope: meta.export.default.tsx
747− - match: (?=$|;|^\s*$|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))
723+ - match: (?=$|;|^\s*abstract\b|^\s*async\b|^\s*class\b|^\s*const\b|^\s*declare\b|^\s*enum\b|^\s*export\b|^\s*function\b|^\s*import\b|^\s*interface\b|^\s*let\b|^\s*module\b|^\s*namespace\b|^\s*return\b|^\s*type\b|^\s*var\b)
748 pop: true
724 pop: true
749− - include: interface-declaration
750 - include: expression
725 - include: expression
751− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(export)(?:\s+(type))?\b(?!(\$)|(\s*:))((?=\s*[\{*])|((?=\s*[_$[:alpha:]][_$[:alnum:]]*(\s|,))(?!\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b)))'
726+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(export)(?!\s*:)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
752 captures:
727 captures:
753− 1: keyword.control.export.tsx
728+ 0: keyword.control.export.tsx
754− 2: keyword.control.type.tsx
755 push:
729 push:
756 - meta_scope: meta.export.tsx
730 - meta_scope: meta.export.tsx
757− - match: (?=$|;|^\s*$|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))
731+ - match: (?=$|;|^\s*abstract\b|^\s*async\b|^\s*class\b|^\s*const\b|^\s*declare\b|^\s*enum\b|^\s*export\b|^\s*function\b|^\s*import\b|^\s*interface\b|^\s*let\b|^\s*module\b|^\s*namespace\b|^\s*return\b|^\s*type\b|^\s*var\b)
758 pop: true
732 pop: true
759 - include: import-export-declaration
733 - include: import-export-declaration
760 expression:
734 expression:
@@ -763,105 +737,7 @@ contexts:
763 - include: expressionPunctuations
737 - include: expressionPunctuations
764 expression-inside-possibly-arrow-parens:
738 expression-inside-possibly-arrow-parens:
765 - include: expressionWithoutIdentifiers
739 - include: expressionWithoutIdentifiers
766− - include: comment
740+ - include: function-parameters-body
767− - include: string
768− - include: decorator
769− - include: destructuring-parameter
770− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(override|public|protected|private|readonly)\s+(?=(override|public|protected|private|readonly)\s+)'
771− captures:
772− 1: storage.modifier.tsx
773− - match: |-
774− (?x)(?:(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(override|public|private|protected|readonly)\s+)?(?:(\.\.\.)\s*)?(?<!=|:)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(this)|([_$[:alpha:]][_$[:alnum:]]*))(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))\s*(\??)(?=\s*
775− # function assignment |
776− (=\s*(
777− ((async\s+)?(
778− (function\s*[(<*]) |
779− (function\s+) |
780− ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
781− )) |
782− ((async\s*)?(
783− ((<\s*$)|([\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
784− # sure shot arrow functions even if => is on new line
785− (
786− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
787− [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
788− (
789− ([)]\s*:) | # ():
790− ((\.\.\.\s*)?[_$[:alpha:]][_$[:alnum:]]*\s*:) # [(]param: | [(]...param:
791− )
792− ) |
793− (
794− [<]\s*[_$[:alpha:]][_$[:alnum:]]*\s+extends\s*[^=>] # < typeparam extends
795− ) |
796− # arrow function possible to detect only with => on same line
797− (
798− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
799− \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
800− (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
801− \s*=> # arrow operator
802− )
803− ))
804− )) |
805− # typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>
806− (:\s*(
807− (<) |
808− ([(]\s*(
809− ([)]) |
810− (\.\.\.) |
811− ([_$[:alnum:]]+\s*(
812− ([:,?=])|
813− ([)]\s*=>)
814− ))
815− ))
816− )) |
817− (:\s*(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))Function(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))) |
818− (:\s*((<\s*$)|([\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*))))))) |
819− (:\s*(=>|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(<[^<>]*>)|[^<>(),=])+=\s*(
820− ((async\s+)?(
821− (function\s*[(<*]) |
822− (function\s+) |
823− ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
824− )) |
825− ((async\s*)?(
826− ((<\s*$)|([\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
827− # sure shot arrow functions even if => is on new line
828− (
829− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
830− [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
831− (
832− ([)]\s*:) | # ():
833− ((\.\.\.\s*)?[_$[:alpha:]][_$[:alnum:]]*\s*:) # [(]param: | [(]...param:
834− )
835− ) |
836− (
837− [<]\s*[_$[:alpha:]][_$[:alnum:]]*\s+extends\s*[^=>] # < typeparam extends
838− ) |
839− # arrow function possible to detect only with => on same line
840− (
841− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
842− \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
843− (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
844− \s*=> # arrow operator
845− )
846− ))
847− )))
848− captures:
849− 1: storage.modifier.tsx
850− 2: keyword.operator.rest.tsx
851− 3: entity.name.function.tsx variable.language.this.tsx
852− 4: entity.name.function.tsx
853− 5: keyword.operator.optional.tsx
854− - match: '(?x)(?:(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(override|public|private|protected|readonly)\s+)?(?:(\.\.\.)\s*)?(?<!=|:)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(this)|([_$[:alpha:]][_$[:alnum:]]*))(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))\s*(\??)(?=\s*[:,]|$)'
855− captures:
856− 1: storage.modifier.tsx
857− 2: keyword.operator.rest.tsx
858− 3: variable.parameter.tsx variable.language.this.tsx
859− 4: variable.parameter.tsx
860− 5: keyword.operator.optional.tsx
861− - include: type-annotation
862− - include: variable-initializer
863− - match: ","
864− scope: punctuation.separator.parameter.tsx
865 - include: identifiers
741 - include: identifiers
866 - include: expressionPunctuations
742 - include: expressionPunctuations
867 expression-operators:
743 expression-operators:
@@ -893,15 +769,11 @@ contexts:
893 - include: typeof-operator
769 - include: typeof-operator
894 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))void(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
770 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))void(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
895 scope: keyword.operator.expression.void.tsx
771 scope: keyword.operator.expression.void.tsx
896− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(as)\s+(const)(?=\s*($|[;,:})\]]))'
897− captures:
898− 1: keyword.control.as.tsx
899− 2: storage.modifier.tsx
900 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(as)\s+'
772 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(as)\s+'
901 captures:
773 captures:
902 1: keyword.control.as.tsx
774 1: keyword.control.as.tsx
903 push:
775 push:
904− - match: '(?=^|[;),}\]:?\-\+\>]|\|\||\&\&|\!\=\=|$|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(as)\s+)|(\s+\<))'
776+ - match: '(?=$|^|[;,:})\]]|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(as)\s+))'
905 pop: true
777 pop: true
906 - include: type
778 - include: type
907 - match: \.\.\.
779 - match: \.\.\.
@@ -916,12 +788,7 @@ contexts:
916 scope: keyword.operator.comparison.tsx
788 scope: keyword.operator.comparison.tsx
917 - match: <=|>=|<>|<|>
789 - match: <=|>=|<>|<|>
918 scope: keyword.operator.relational.tsx
790 scope: keyword.operator.relational.tsx
919− - match: '(?<=[_$[:alnum:]])(\!)\s*(?:(/=)|(?:(/)(?![/*])))'
791+ - match: \!|&&|\|\|
920− captures:
921− 1: keyword.operator.logical.tsx
922− 2: keyword.operator.assignment.compound.tsx
923− 3: keyword.operator.arithmetic.tsx
924− - match: \!|&&|\|\||\?\?
925 scope: keyword.operator.logical.tsx
792 scope: keyword.operator.logical.tsx
926 - match: \&|~|\^|\|
793 - match: \&|~|\^|\|
927 scope: keyword.operator.bitwise.tsx
794 scope: keyword.operator.bitwise.tsx
@@ -933,18 +800,9 @@ contexts:
933 scope: keyword.operator.increment.tsx
800 scope: keyword.operator.increment.tsx
934 - match: '%|\*|/|-|\+'
801 - match: '%|\*|/|-|\+'
935 scope: keyword.operator.arithmetic.tsx
802 scope: keyword.operator.arithmetic.tsx
936− - match: '(?<=[_$[:alnum:])\]])\s*(?=(\/\*([^\*]|(\*[^\/]))*\*\/\s*)+(?:(/=)|(?:(/)(?![/*]))))'
803+ - match: '(?<=[_$[:alnum:])\]])\s*(/)(?![/*])'
937− push:
938− - match: '(?:(/=)|(?:(/)(?!\*([^\*]|(\*[^\/]))*\*\/)))'
939− captures:
940− 1: keyword.operator.assignment.compound.tsx
941− 2: keyword.operator.arithmetic.tsx
942− pop: true
943− - include: comment
944− - match: '(?<=[_$[:alnum:])\]])\s*(?:(/=)|(?:(/)(?![/*])))'
945 captures:
804 captures:
946− 1: keyword.operator.assignment.compound.tsx
805+ 1: keyword.operator.arithmetic.tsx
947− 2: keyword.operator.arithmetic.tsx
948 expressionPunctuations:
806 expressionPunctuations:
949 - include: punctuation-comma
807 - include: punctuation-comma
950 - include: punctuation-accessor
808 - include: punctuation-accessor
@@ -952,6 +810,7 @@ contexts:
952 - include: jsx
810 - include: jsx
953 - include: string
811 - include: string
954 - include: regex
812 - include: regex
813+ - include: template
955 - include: comment
814 - include: comment
956 - include: function-expression
815 - include: function-expression
957 - include: class-expression
816 - include: class-expression
@@ -969,123 +828,143 @@ contexts:
969 - include: paren-expression
828 - include: paren-expression
970 field-declaration:
829 field-declaration:
971 - match: |-
830 - match: |-
972− (?x)(?<!\()(?:(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(readonly)\s+)?(?=\s*((\b(?<!\$)0(?:x|X)[0-9a-fA-F][0-9a-fA-F_]*(n)?\b(?!\$))|(\b(?<!\$)0(?:b|B)[01][01_]*(n)?\b(?!\$))|(\b(?<!\$)0(?:o|O)?[0-7][0-7_]*(n)?\b(?!\$))|((?<!\$)(?:
831+ (?x)(?<!\()(?:(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(readonly)\s+)?(?=\s*((\b(?<!\$)0(x|X)[0-9a-fA-F][0-9a-fA-F_]*\b(?!\$))|(\b(?<!\$)0(b|B)[01][01_]*\b(?!\$))|(\b(?<!\$)0(o|O)?[0-7][0-7_]*\b(?!\$))|((?<!\$)(?:
973− (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1.1E+3
832+ (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # 1.1E+3
974− (?:\b[0-9][0-9_]*(\.)[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1.E+3
833+ (?:\b[0-9][0-9_]*(\.)[eE][+-]?[0-9][0-9_]*\b)| # 1.E+3
975− (?:\B(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # .1E+3
834+ (?:\B(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # .1E+3
976− (?:\b[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1E+3
835+ (?:\b[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # 1E+3
977− (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*(n)?\b)| # 1.1
836+ (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*\b)| # 1.1
978− (?:\b[0-9][0-9_]*(\.)(n)?\B)| # 1.
837+ (?:\b[0-9][0-9_]*(\.)\B)| # 1.
979− (?:\B(\.)[0-9][0-9_]*(n)?\b)| # .1
838+ (?:\B(\.)[0-9][0-9_]*\b)| # .1
980− (?:\b[0-9][0-9_]*(n)?\b(?!\.)) # 1
839+ (?:\b[0-9][0-9_]*\b(?!\.)) # 1
981− )(?!\$))|(\#?[_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`)|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(?:(?:(\?)|(\!))\s*)?(=|:|;|,|\}|$))
840+ )(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\\'|\\)*\')|(\"([^\"\\]|\\\"|\\)*\")|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(\?\s*)?(=|:))
982 captures:
841 captures:
983 1: storage.modifier.tsx
842 1: storage.modifier.tsx
984 push:
843 push:
985 - meta_scope: meta.field.declaration.tsx
844 - meta_scope: meta.field.declaration.tsx
986 - match: |-
845 - match: |-
987− (?x)(?=\}|;|,|$|(^(?!\s*((\b(?<!\$)0(?:x|X)[0-9a-fA-F][0-9a-fA-F_]*(n)?\b(?!\$))|(\b(?<!\$)0(?:b|B)[01][01_]*(n)?\b(?!\$))|(\b(?<!\$)0(?:o|O)?[0-7][0-7_]*(n)?\b(?!\$))|((?<!\$)(?:
846+ (?x)(?=\}|;|,|$|(^(?!\s*((\b(?<!\$)0(x|X)[0-9a-fA-F][0-9a-fA-F_]*\b(?!\$))|(\b(?<!\$)0(b|B)[01][01_]*\b(?!\$))|(\b(?<!\$)0(o|O)?[0-7][0-7_]*\b(?!\$))|((?<!\$)(?:
988− (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1.1E+3
847+ (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # 1.1E+3
989− (?:\b[0-9][0-9_]*(\.)[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1.E+3
848+ (?:\b[0-9][0-9_]*(\.)[eE][+-]?[0-9][0-9_]*\b)| # 1.E+3
990− (?:\B(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # .1E+3
849+ (?:\B(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # .1E+3
991− (?:\b[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1E+3
850+ (?:\b[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # 1E+3
992− (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*(n)?\b)| # 1.1
851+ (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*\b)| # 1.1
993− (?:\b[0-9][0-9_]*(\.)(n)?\B)| # 1.
852+ (?:\b[0-9][0-9_]*(\.)\B)| # 1.
994− (?:\B(\.)[0-9][0-9_]*(n)?\b)| # .1
853+ (?:\B(\.)[0-9][0-9_]*\b)| # .1
995− (?:\b[0-9][0-9_]*(n)?\b(?!\.)) # 1
854+ (?:\b[0-9][0-9_]*\b(?!\.)) # 1
996− )(?!\$))|(\#?[_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`)|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(?:(?:(\?)|(\!))\s*)?(=|:|;|,|$))))|(?<=\})
855+ )(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\\'|\\)*\')|(\"([^\"\\]|\\\"|\\)*\")|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(\?\s*)?(=|:))))|(?<=\})
997 pop: true
856 pop: true
998 - include: variable-initializer
857 - include: variable-initializer
999− - include: type-annotation
1000− - include: string
1001− - include: array-literal
1002− - include: numeric-literal
1003− - include: comment
1004 - match: |-
858 - match: |-
1005− (?x)(\#?[_$[:alpha:]][_$[:alnum:]]*)(?:(\?)|(\!))?(?=\s*\s*
859+ (?x)(?=((\b(?<!\$)0(x|X)[0-9a-fA-F][0-9a-fA-F_]*\b(?!\$))|(\b(?<!\$)0(b|B)[01][01_]*\b(?!\$))|(\b(?<!\$)0(o|O)?[0-7][0-7_]*\b(?!\$))|((?<!\$)(?:
1006− # function assignment |
860+ (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # 1.1E+3
1007− (=\s*(
861+ (?:\b[0-9][0-9_]*(\.)[eE][+-]?[0-9][0-9_]*\b)| # 1.E+3
1008− ((async\s+)?(
862+ (?:\B(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # .1E+3
1009− (function\s*[(<*]) |
863+ (?:\b[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # 1E+3
1010− (function\s+) |
864+ (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*\b)| # 1.1
1011− ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
865+ (?:\b[0-9][0-9_]*(\.)\B)| # 1.
1012− )) |
866+ (?:\B(\.)[0-9][0-9_]*\b)| # .1
1013− ((async\s*)?(
867+ (?:\b[0-9][0-9_]*\b(?!\.)) # 1
1014− ((<\s*$)|([\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
868+ )(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\\'|\\)*\')|(\"([^\"\\]|\\\"|\\)*\")|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(\?\s*)?(=|:))
1015− # sure shot arrow functions even if => is on new line
869+ push:
1016− (
870+ - match: |-
1017− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
871+ (?x)(?=[};,=]|$|(^(?!\s*((\b(?<!\$)0(x|X)[0-9a-fA-F][0-9a-fA-F_]*\b(?!\$))|(\b(?<!\$)0(b|B)[01][01_]*\b(?!\$))|(\b(?<!\$)0(o|O)?[0-7][0-7_]*\b(?!\$))|((?<!\$)(?:
1018− [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
872+ (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # 1.1E+3
1019− (
873+ (?:\b[0-9][0-9_]*(\.)[eE][+-]?[0-9][0-9_]*\b)| # 1.E+3
1020− ([)]\s*:) | # ():
874+ (?:\B(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # .1E+3
1021− ((\.\.\.\s*)?[_$[:alpha:]][_$[:alnum:]]*\s*:) # [(]param: | [(]...param:
875+ (?:\b[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # 1E+3
1022− )
876+ (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*\b)| # 1.1
1023− ) |
877+ (?:\b[0-9][0-9_]*(\.)\B)| # 1.
1024− (
878+ (?:\B(\.)[0-9][0-9_]*\b)| # .1
1025− [<]\s*[_$[:alpha:]][_$[:alnum:]]*\s+extends\s*[^=>] # < typeparam extends
879+ (?:\b[0-9][0-9_]*\b(?!\.)) # 1
1026− ) |
880+ )(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\\'|\\)*\')|(\"([^\"\\]|\\\"|\\)*\")|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(\?\s*)?(=|:))))|(?<=\})
1027− # arrow function possible to detect only with => on same line
881+ pop: true
1028− (
882+ - include: type-annotation
1029− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
883+ - include: string
1030− \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
884+ - include: array-literal
1031− (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
885+ - include: numeric-literal
1032− \s*=> # arrow operator
886+ - include: comment
1033− )
887+ - match: |-
1034− ))
888+ (?x)([_$[:alpha:]][_$[:alnum:]]*)(\?)?(?=(\?\s*)?\s*
1035− )) |
889+ # function assignment |
1036− # typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>
890+ (=\s*(
1037− (:\s*(
891+ ((async\s+)?(
1038− (<) |
892+ (function\s*[(<*]) |
1039− ([(]\s*(
893+ (function\s+) |
1040− ([)]) |
894+ ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
1041− (\.\.\.) |
895+ )) |
1042− ([_$[:alnum:]]+\s*(
896+ ((async\s*)?(
1043− ([:,?=])|
897+ ((<\s*$)|([\(]\s*([\{\[]\s*)?$)) |
1044− ([)]\s*=>)
898+ # sure shot arrow functions even if => is on new line
1045− ))
899+ (
1046− ))
900+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*>\s*)?
1047− )) |
901+ [(]\s*
1048− (:\s*(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))Function(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))) |
902+ (
1049− (:\s*((<\s*$)|([\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*))))))) |
903+ ([)]\s*:) | # ():
1050− (:\s*(=>|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(<[^<>]*>)|[^<>(),=])+=\s*(
904+ ((\.\.\.\s*)?[_$[:alpha:]][_$[:alnum:]]*\s*:) # [(]param: | [(]...param:
1051− ((async\s+)?(
905+ )
1052− (function\s*[(<*]) |
906+ ) |
1053− (function\s+) |
907+ (
1054− ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
908+ [<]\s*[_$[:alpha:]][_$[:alnum:]]*\s+extends\s*[^=>] # < typeparam extends
1055− )) |
909+ ) |
1056− ((async\s*)?(
910+ # arrow function possible to detect only with => on same line
1057− ((<\s*$)|([\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
911+ (
1058− # sure shot arrow functions even if => is on new line
912+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*>\s*)? # typeparameters
1059− (
913+ \(\s*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()]|(\(([^\(\)]|(\([^\(\)]*\)))*\)))*)?\) # parameters
1060− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
914+ (\s*:\s*([^<>\(\)]|\<[^<>]+\>|\([^\(\)]+\))+)? # return type
1061− [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
915+ \s*=> # arrow operator
1062− (
916+ )
1063− ([)]\s*:) | # ():
917+ ))
1064− ((\.\.\.\s*)?[_$[:alpha:]][_$[:alnum:]]*\s*:) # [(]param: | [(]...param:
918+ )) |
1065− )
919+ # typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>
1066− ) |
920+ (:\s*(
1067− (
921+ (<) |
1068− [<]\s*[_$[:alpha:]][_$[:alnum:]]*\s+extends\s*[^=>] # < typeparam extends
922+ ([(]\s*(
1069− ) |
923+ ([)]) |
1070− # arrow function possible to detect only with => on same line
924+ (\.\.\.) |
1071− (
925+ ([_$[:alnum:]]+\s*(
1072− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
926+ ([:,?=])|
1073− \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
927+ ([)]\s*=>)
1074− (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
928+ ))
1075− \s*=> # arrow operator
929+ ))
1076− )
930+ )) |
1077− ))
931+ (:\s*((<\s*$)|([\(]\s*([\{\[]\s*)?$))) |
1078− )))
932+ (:\s*(=>|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(<[^<>]*>)|[^<>(),=])+=\s*(
1079− captures:
933+ ((async\s+)?(
1080− 1: meta.definition.property.tsx entity.name.function.tsx
934+ (function\s*[(<*]) |
1081− 2: keyword.operator.optional.tsx
935+ (function\s+) |
1082− 3: keyword.operator.definiteassignment.tsx
936+ ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
1083− - match: '\#?[_$[:alpha:]][_$[:alnum:]]*'
937+ )) |
1084− scope: meta.definition.property.tsx variable.object.property.tsx
938+ ((async\s*)?(
1085− - match: \?
939+ ((<\s*$)|([\(]\s*([\{\[]\s*)?$)) |
1086− scope: keyword.operator.optional.tsx
940+ # sure shot arrow functions even if => is on new line
1087− - match: \!
941+ (
1088− scope: keyword.operator.definiteassignment.tsx
942+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*>\s*)?
943+ [(]\s*
944+ (
945+ ([)]\s*:) | # ():
946+ ((\.\.\.\s*)?[_$[:alpha:]][_$[:alnum:]]*\s*:) # [(]param: | [(]...param:
947+ )
948+ ) |
949+ (
950+ [<]\s*[_$[:alpha:]][_$[:alnum:]]*\s+extends\s*[^=>] # < typeparam extends
951+ ) |
952+ # arrow function possible to detect only with => on same line
953+ (
954+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*>\s*)? # typeparameters
955+ \(\s*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()]|(\(([^\(\)]|(\([^\(\)]*\)))*\)))*)?\) # parameters
956+ (\s*:\s*([^<>\(\)]|\<[^<>]+\>|\([^\(\)]+\))+)? # return type
957+ \s*=> # arrow operator
958+ )
959+ ))
960+ )))
961+ captures:
962+ 1: meta.definition.property.tsx entity.name.function.tsx
963+ 2: keyword.operator.optional.tsx
964+ - match: "[_$[:alpha:]][_$[:alnum:]]*"
965+ scope: meta.definition.property.tsx variable.object.property.tsx
966+ - match: \?
967+ scope: keyword.operator.optional.tsx
1089 for-loop:
968 for-loop:
1090 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))for(?=((\s+|(\s*\/\*([^\*]|(\*[^\/]))*\*\/\s*))await)?\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)?(\())'
969 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))for(?=((\s+|(\s*\/\*([^\*]|(\*[^\/]))*\*\/\s*))await)?\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)?(\())'
1091 captures:
970 captures:
@@ -1112,59 +991,43 @@ contexts:
1112 - include: type-parameters
991 - include: type-parameters
1113 - include: function-parameters
992 - include: function-parameters
1114 - include: return-type
993 - include: return-type
1115− - include: type-function-return-type
1116 - include: decl-block
994 - include: decl-block
1117 - match: \*
995 - match: \*
1118 scope: keyword.generator.asterisk.tsx
996 scope: keyword.generator.asterisk.tsx
1119 function-call:
997 function-call:
1120− - match: '(?=(((([_$[:alpha:]][_$[:alnum:]]*)(\s*\??\.\s*(\#?[_$[:alpha:]][_$[:alnum:]]*))*)|(\??\.\s*\#?[_$[:alpha:]][_$[:alnum:]]*))|(?<=[\)]))\s*(?:(\?\.\s*)|(\!))?((<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))(([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>)*(?<!=)\>))*(?<!=)\>)*(?<!=)>\s*)?\())'
998+ - match: '(?=(([_$[:alpha:]][_$[:alnum:]]*\s*\??\.\s*)*|(\??\.\s*)?)([_$[:alpha:]][_$[:alnum:]]*)\s*(\?\.\s*)?(<\s*(((keyof|infer)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\''[^\'']*\'')|(\"[^\"]*\")|(\`[^\`]*\`))(?=\s*([\<\>\,\.\[=]|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?<==)\>|\<\s*(((keyof|infer)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\''[^\'']*\'')|(\"[^\"]*\")|(\`[^\`]*\`))(?=\s*([\<\>\,\.\[=]|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?<==)\>)*(?!=)\>)*(?!=)>\s*)?\()'
1121 push:
999 push:
1122− - match: '(?<=\))(?!(((([_$[:alpha:]][_$[:alnum:]]*)(\s*\??\.\s*(\#?[_$[:alpha:]][_$[:alnum:]]*))*)|(\??\.\s*\#?[_$[:alpha:]][_$[:alnum:]]*))|(?<=[\)]))\s*(?:(\?\.\s*)|(\!))?((<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))(([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>)*(?<!=)\>))*(?<!=)\>)*(?<!=)>\s*)?\())'
1000+ - match: '(?<=\))(?!(([_$[:alpha:]][_$[:alnum:]]*\s*\??\.\s*)*|(\??\.\s*)?)([_$[:alpha:]][_$[:alnum:]]*)\s*(\?\.\s*)?(<\s*(((keyof|infer)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\''[^\'']*\'')|(\"[^\"]*\")|(\`[^\`]*\`))(?=\s*([\<\>\,\.\[=]|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?<==)\>|\<\s*(((keyof|infer)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\''[^\'']*\'')|(\"[^\"]*\")|(\`[^\`]*\`))(?=\s*([\<\>\,\.\[=]|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?<==)\>)*(?!=)\>)*(?!=)>\s*)?\()'
1123 pop: true
1001 pop: true
1124− - match: '(?=(([_$[:alpha:]][_$[:alnum:]]*)(\s*\??\.\s*(\#?[_$[:alpha:]][_$[:alnum:]]*))*)|(\??\.\s*\#?[_$[:alpha:]][_$[:alnum:]]*))'
1002+ - match: '(?=(([_$[:alpha:]][_$[:alnum:]]*\s*\??\.\s*)*|(\??\.\s*)?)([_$[:alpha:]][_$[:alnum:]]*))'
1125 push:
1003 push:
1126 - meta_scope: meta.function-call.tsx
1004 - meta_scope: meta.function-call.tsx
1127− - match: '(?=\s*(?:(\?\.\s*)|(\!))?((<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))(([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>)*(?<!=)\>))*(?<!=)\>)*(?<!=)>\s*)?\())'
1005+ - match: '(?=\s*(\?\.\s*)?(<\s*(((keyof|infer)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\''[^\'']*\'')|(\"[^\"]*\")|(\`[^\`]*\`))(?=\s*([\<\>\,\.\[=]|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?<==)\>|\<\s*(((keyof|infer)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\''[^\'']*\'')|(\"[^\"]*\")|(\`[^\`]*\`))(?=\s*([\<\>\,\.\[=]|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?<==)\>)*(?!=)\>)*(?!=)>\s*)?\()'
1128 pop: true
1006 pop: true
1129− - include: function-call-target
1007+ - include: literal
1008+ - include: support-objects
1009+ - include: object-identifiers
1010+ - include: punctuation-accessor
1011+ - match: '(?:(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))import(?=\s*[\(]\s*[\"\''\`]))'
1012+ scope: keyword.operator.expression.import.tsx
1013+ - match: "([_$[:alpha:]][_$[:alnum:]]*)"
1014+ scope: entity.name.function.tsx
1130 - include: comment
1015 - include: comment
1131− - include: function-call-optionals
1016+ - match: \?\.
1017+ scope: meta.function-call.tsx punctuation.accessor.optional.tsx
1132 - include: type-arguments
1018 - include: type-arguments
1133 - include: paren-expression
1019 - include: paren-expression
1134− - match: '(?=(((([_$[:alpha:]][_$[:alnum:]]*)(\s*\??\.\s*(\#?[_$[:alpha:]][_$[:alnum:]]*))*)|(\??\.\s*\#?[_$[:alpha:]][_$[:alnum:]]*))|(?<=[\)]))(<\s*[\{\[\(]\s*$))'
1135− push:
1136− - match: '(?<=\>)(?!(((([_$[:alpha:]][_$[:alnum:]]*)(\s*\??\.\s*(\#?[_$[:alpha:]][_$[:alnum:]]*))*)|(\??\.\s*\#?[_$[:alpha:]][_$[:alnum:]]*))|(?<=[\)]))(<\s*[\{\[\(]\s*$))'
1137− pop: true
1138− - match: '(?=(([_$[:alpha:]][_$[:alnum:]]*)(\s*\??\.\s*(\#?[_$[:alpha:]][_$[:alnum:]]*))*)|(\??\.\s*\#?[_$[:alpha:]][_$[:alnum:]]*))'
1139− push:
1140− - meta_scope: meta.function-call.tsx
1141− - match: '(?=(<\s*[\{\[\(]\s*$))'
1142− pop: true
1143− - include: function-call-target
1144− - include: comment
1145− - include: function-call-optionals
1146− - include: type-arguments
1147− function-call-optionals:
1148− - match: \?\.
1149− scope: meta.function-call.tsx punctuation.accessor.optional.tsx
1150− - match: \!
1151− scope: meta.function-call.tsx keyword.operator.definiteassignment.tsx
1152− function-call-target:
1153− - include: support-function-call-identifiers
1154− - match: '(\#?[_$[:alpha:]][_$[:alnum:]]*)'
1155− scope: entity.name.function.tsx
1156 function-declaration:
1020 function-declaration:
1157− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?(?:(async)\s+)?(function\b)(?:\s*(\*))?(?:(?:\s+|(?<=\*))([_$[:alpha:]][_$[:alnum:]]*))?\s*'
1021+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(export)\s+)?(?:(async)\s+)?(function\b)(?:\s*(\*))?(?:(?:\s+|(?<=\*))([_$[:alpha:]][_$[:alnum:]]*))?\s*'
1158 captures:
1022 captures:
1159 1: keyword.control.export.tsx
1023 1: keyword.control.export.tsx
1160− 2: storage.modifier.tsx
1024+ 2: storage.modifier.async.tsx
1161− 3: storage.modifier.async.tsx
1025+ 3: storage.type.function.tsx
1162− 4: storage.type.function.tsx
1026+ 4: keyword.generator.asterisk.tsx
1163− 5: keyword.generator.asterisk.tsx
1027+ 5: meta.definition.function.tsx entity.name.function.tsx
1164− 6: meta.definition.function.tsx entity.name.function.tsx
1165 push:
1028 push:
1166 - meta_scope: meta.function.tsx
1029 - meta_scope: meta.function.tsx
1167− - match: '(?=;|^\s*$|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))|(?<=\})'
1030+ - match: '(?=$|^|;)|(?<=\})'
1168 pop: true
1031 pop: true
1169 - include: function-name
1032 - include: function-name
1170 - include: function-body
1033 - include: function-body
@@ -1177,10 +1040,9 @@ contexts:
1177 4: meta.definition.function.tsx entity.name.function.tsx
1040 4: meta.definition.function.tsx entity.name.function.tsx
1178 push:
1041 push:
1179 - meta_scope: meta.function.expression.tsx
1042 - meta_scope: meta.function.expression.tsx
1180− - match: '(?=;)|(?<=\})'
1043+ - match: '(?<=\})'
1181 pop: true
1044 pop: true
1182 - include: function-name
1045 - include: function-name
1183− - include: single-line-comment-consuming-line-ending
1184 - include: function-body
1046 - include: function-body
1185 function-name:
1047 function-name:
1186 - match: "[_$[:alpha:]][_$[:alnum:]]*"
1048 - match: "[_$[:alpha:]][_$[:alnum:]]*"
@@ -1198,11 +1060,10 @@ contexts:
1198 - include: function-parameters-body
1060 - include: function-parameters-body
1199 function-parameters-body:
1061 function-parameters-body:
1200 - include: comment
1062 - include: comment
1201− - include: string
1202 - include: decorator
1063 - include: decorator
1203 - include: destructuring-parameter
1064 - include: destructuring-parameter
1204 - include: parameter-name
1065 - include: parameter-name
1205− - include: parameter-type-annotation
1066+ - include: type-annotation
1206 - include: variable-initializer
1067 - include: variable-initializer
1207 - match: ","
1068 - match: ","
1208 scope: punctuation.separator.parameter.tsx
1069 scope: punctuation.separator.parameter.tsx
@@ -1216,11 +1077,11 @@ contexts:
1216 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
1077 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
1217 )) |
1078 )) |
1218 ((async\s*)?(
1079 ((async\s*)?(
1219− ((<\s*$)|([\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
1080+ ((<\s*$)|([\(]\s*([\{\[]\s*)?$)) |
1220 # sure shot arrow functions even if => is on new line
1081 # sure shot arrow functions even if => is on new line
1221 (
1082 (
1222− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
1083+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*>\s*)?
1223− [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
1084+ [(]\s*
1224 (
1085 (
1225 ([)]\s*:) | # ():
1086 ([)]\s*:) | # ():
1226 ((\.\.\.\s*)?[_$[:alpha:]][_$[:alnum:]]*\s*:) # [(]param: | [(]...param:
1087 ((\.\.\.\s*)?[_$[:alpha:]][_$[:alnum:]]*\s*:) # [(]param: | [(]...param:
@@ -1231,9 +1092,9 @@ contexts:
1231 ) |
1092 ) |
1232 # arrow function possible to detect only with => on same line
1093 # arrow function possible to detect only with => on same line
1233 (
1094 (
1234− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
1095+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*>\s*)? # typeparameters
1235− \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
1096+ \(\s*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()]|(\(([^\(\)]|(\([^\(\)]*\)))*\)))*)?\) # parameters
1236− (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
1097+ (\s*:\s*([^<>\(\)]|\<[^<>]+\>|\([^\(\)]+\))+)? # return type
1237 \s*=> # arrow operator
1098 \s*=> # arrow operator
1238 )
1099 )
1239 ))
1100 ))
@@ -1242,12 +1103,12 @@ contexts:
1242 1: punctuation.accessor.tsx
1103 1: punctuation.accessor.tsx
1243 2: punctuation.accessor.optional.tsx
1104 2: punctuation.accessor.optional.tsx
1244 3: entity.name.function.tsx
1105 3: entity.name.function.tsx
1245− - match: '(?:(\.)|(\?\.(?!\s*[[:digit:]])))\s*(\#?[[:upper:]][_$[:digit:][:upper:]]*)(?![_$[:alnum:]])'
1106+ - match: '(?:(\.)|(\?\.(?!\s*[[:digit:]])))\s*([[:upper:]][_$[:digit:][:upper:]]*)(?![_$[:alnum:]])'
1246 captures:
1107 captures:
1247 1: punctuation.accessor.tsx
1108 1: punctuation.accessor.tsx
1248 2: punctuation.accessor.optional.tsx
1109 2: punctuation.accessor.optional.tsx
1249 3: variable.other.constant.property.tsx
1110 3: variable.other.constant.property.tsx
1250− - match: '(?:(\.)|(\?\.(?!\s*[[:digit:]])))\s*(\#?[_$[:alpha:]][_$[:alnum:]]*)'
1111+ - match: '(?:(\.)|(\?\.(?!\s*[[:digit:]])))\s*([_$[:alpha:]][_$[:alnum:]]*)'
1251 captures:
1112 captures:
1252 1: punctuation.accessor.tsx
1113 1: punctuation.accessor.tsx
1253 2: punctuation.accessor.optional.tsx
1114 2: punctuation.accessor.optional.tsx
@@ -1256,46 +1117,15 @@ contexts:
1256 scope: variable.other.constant.tsx
1117 scope: variable.other.constant.tsx
1257 - match: "[_$[:alpha:]][_$[:alnum:]]*"
1118 - match: "[_$[:alpha:]][_$[:alnum:]]*"
1258 scope: variable.other.readwrite.tsx
1119 scope: variable.other.readwrite.tsx
1259− if-statement:
1260− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?=\bif\s*(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))\s*(?!\{))'
1261− push:
1262− - match: '(?=;|$|\})'
1263− pop: true
1264− - include: comment
1265− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(if)\s*(\()'
1266− captures:
1267− 1: keyword.control.conditional.tsx
1268− 2: meta.brace.round.tsx
1269− push:
1270− - match: \)
1271− captures:
1272− 0: meta.brace.round.tsx
1273− pop: true
1274− - include: expression
1275− - match: '(?<=\))\s*\/(?![\/*])(?=(?:[^\/\\\[]|\\.|\[([^\]\\]|\\.)*\])+\/([dgimsuy]+|(?![\/\*])|(?=\/\*))(?!\s*[a-zA-Z0-9_$]))'
1276− captures:
1277− 0: punctuation.definition.string.begin.tsx
1278− push:
1279− - meta_scope: string.regexp.tsx
1280− - match: "(/)([dgimsuy]*)"
1281− captures:
1282− 1: punctuation.definition.string.end.tsx
1283− 2: keyword.other.tsx
1284− pop: true
1285− - include: regexp
1286− - include: statements
1287 import-declaration:
1120 import-declaration:
1288− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(import)(?:\s+(type)(?!\s+from))?(?!\s*[:\(])(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
1121+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?\b(import)(?!\s*[:\(])(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
1289 captures:
1122 captures:
1290 1: keyword.control.export.tsx
1123 1: keyword.control.export.tsx
1291− 2: storage.modifier.tsx
1124+ 2: keyword.control.import.tsx
1292− 3: keyword.control.import.tsx
1293− 4: keyword.control.type.tsx
1294 push:
1125 push:
1295 - meta_scope: meta.import.tsx
1126 - meta_scope: meta.import.tsx
1296 - match: '(?<!^import|[^\._$[:alnum:]]import)(?=;|$|^)'
1127 - match: '(?<!^import|[^\._$[:alnum:]]import)(?=;|$|^)'
1297 pop: true
1128 pop: true
1298− - include: single-line-comment-consuming-line-ending
1299 - include: comment
1129 - include: comment
1300 - include: string
1130 - include: string
1301 - match: '(?<=^import|[^\._$[:alnum:]]import)(?!\s*["''])'
1131 - match: '(?<=^import|[^\._$[:alnum:]]import)(?!\s*["''])'
@@ -1307,16 +1137,14 @@ contexts:
1307 - include: import-export-declaration
1137 - include: import-export-declaration
1308 - include: import-export-declaration
1138 - include: import-export-declaration
1309 import-equals-declaration:
1139 import-equals-declaration:
1310− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(import)(?:\s+(type))?\s+([_$[:alpha:]][_$[:alnum:]]*)\s*(=)\s*(require)\s*(\()'
1140+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?\b(import)\s+([_$[:alpha:]][_$[:alnum:]]*)\s*(=)\s*(require)\s*(\()'
1311 captures:
1141 captures:
1312 1: keyword.control.export.tsx
1142 1: keyword.control.export.tsx
1313− 2: storage.modifier.tsx
1143+ 2: keyword.control.import.tsx
1314− 3: keyword.control.import.tsx
1144+ 3: variable.other.readwrite.alias.tsx
1315− 4: keyword.control.type.tsx
1145+ 4: keyword.operator.assignment.tsx
1316− 5: variable.other.readwrite.alias.tsx
1146+ 5: keyword.control.require.tsx
1317− 6: keyword.operator.assignment.tsx
1147+ 6: meta.brace.round.tsx
1318− 7: keyword.control.require.tsx
1319− 8: meta.brace.round.tsx
1320 push:
1148 push:
1321 - meta_scope: meta.import-equals.external.tsx
1149 - meta_scope: meta.import-equals.external.tsx
1322 - match: \)
1150 - match: \)
@@ -1325,19 +1153,16 @@ contexts:
1325 pop: true
1153 pop: true
1326 - include: comment
1154 - include: comment
1327 - include: string
1155 - include: string
1328− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(import)(?:\s+(type))?\s+([_$[:alpha:]][_$[:alnum:]]*)\s*(=)\s*(?!require\b)'
1156+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?\b(import)\s+([_$[:alpha:]][_$[:alnum:]]*)\s*(=)\s*(?!require\b)'
1329 captures:
1157 captures:
1330 1: keyword.control.export.tsx
1158 1: keyword.control.export.tsx
1331− 2: storage.modifier.tsx
1159+ 2: keyword.control.import.tsx
1332− 3: keyword.control.import.tsx
1160+ 3: variable.other.readwrite.alias.tsx
1333− 4: keyword.control.type.tsx
1161+ 4: keyword.operator.assignment.tsx
1334− 5: variable.other.readwrite.alias.tsx
1335− 6: keyword.operator.assignment.tsx
1336 push:
1162 push:
1337 - meta_scope: meta.import-equals.internal.tsx
1163 - meta_scope: meta.import-equals.internal.tsx
1338 - match: (?=;|$|^)
1164 - match: (?=;|$|^)
1339 pop: true
1165 pop: true
1340− - include: single-line-comment-consuming-line-ending
1341 - include: comment
1166 - include: comment
1342 - match: '([_$[:alpha:]][_$[:alnum:]]*)\s*(?:(\.)|(\?\.(?!\s*[[:digit:]])))'
1167 - match: '([_$[:alpha:]][_$[:alnum:]]*)\s*(?:(\.)|(\?\.(?!\s*[[:digit:]])))'
1343 captures:
1168 captures:
@@ -1359,7 +1184,7 @@ contexts:
1359 - include: import-export-clause
1184 - include: import-export-clause
1360 import-export-clause:
1185 import-export-clause:
1361 - include: comment
1186 - include: comment
1362− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bdefault)|(\*)|(\b[_$[:alpha:]][_$[:alnum:]]*))\s+(as)\s+(?:(default(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.)))|([_$[:alpha:]][_$[:alnum:]]*))'
1187+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bdefault)|(\*)|(\b[_$[:alpha:]][_$[:alnum:]]*))\s+(as)\s+(?:(\bdefault(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.)))|(\b[_$[:alpha:]][_$[:alnum:]]*))'
1363 captures:
1188 captures:
1364 1: keyword.control.default.tsx
1189 1: keyword.control.default.tsx
1365 2: constant.language.import-export-all.tsx
1190 2: constant.language.import-export-all.tsx
@@ -1411,9 +1236,6 @@ contexts:
1411 2: keyword.operator.type.modifier.tsx
1236 2: keyword.operator.type.modifier.tsx
1412 3: keyword.operator.optional.tsx
1237 3: keyword.operator.optional.tsx
1413 pop: true
1238 pop: true
1414− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(as)\s+'
1415− captures:
1416− 1: keyword.control.as.tsx
1417 - include: type
1239 - include: type
1418 inline-tags:
1240 inline-tags:
1419 - match: '(\[)[^\]]+(\])(?={@(?:link|linkcode|linkplain|tutorial))'
1241 - match: '(\[)[^\]]+(\])(?={@(?:link|linkcode|linkplain|tutorial))'
@@ -1445,16 +1267,15 @@ contexts:
1445 captures:
1267 captures:
1446 1: keyword.operator.expression.instanceof.tsx
1268 1: keyword.operator.expression.instanceof.tsx
1447 push:
1269 push:
1448− - match: '(?<=\))|(?=[;),}\]:?\-\+\>]|\|\||\&\&|\!\=\=|$|(([\&\~\^\|]\s*)?[_$[:alpha:]][_$[:alnum:]]*\s+instanceof(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.)))|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))function((\s+[_$[:alpha:]][_$[:alnum:]]*)|(\s*[\(]))))'
1270+ - match: '(?<=\))|(?=[;),}\]:?]|\|\||\&\&|$|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))function((\s+[_$[:alpha:]][_$[:alnum:]]*)|(\s*[\(]))))'
1449 pop: true
1271 pop: true
1450 - include: type
1272 - include: type
1451 interface-declaration:
1273 interface-declaration:
1452− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(?:(abstract)\s+)?\b(interface)\b(?=\s+|/[/*])'
1274+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(export)\s+)?\b(?:(abstract)\s+)?\b(interface)\b(?=\s+|/[/*])'
1453 captures:
1275 captures:
1454 1: keyword.control.export.tsx
1276 1: keyword.control.export.tsx
1455 2: storage.modifier.tsx
1277 2: storage.modifier.tsx
1456− 3: storage.modifier.tsx
1278+ 3: storage.type.interface.tsx
1457− 4: storage.type.interface.tsx
1458 push:
1279 push:
1459 - meta_scope: meta.interface.tsx
1280 - meta_scope: meta.interface.tsx
1460 - match: '(?<=\})'
1281 - match: '(?<=\})'
@@ -1502,7 +1323,7 @@ contexts:
1502 captures:
1323 captures:
1503 0: punctuation.section.embedded.begin.tsx
1324 0: punctuation.section.embedded.begin.tsx
1504 push:
1325 push:
1505− - meta_content_scope: meta.embedded.expression.tsx
1326+ - meta_scope: meta.embedded.expression.tsx
1506 - match: '\}'
1327 - match: '\}'
1507 captures:
1328 captures:
1508 0: punctuation.section.embedded.end.tsx
1329 0: punctuation.section.embedded.end.tsx
@@ -1531,10 +1352,10 @@ contexts:
1531 pop: true
1352 pop: true
1532 - include: jsx-entities
1353 - include: jsx-entities
1533 jsx-tag:
1354 jsx-tag:
1534− - match: '(?=(<)\s*(?:([_$[:alpha:]][-_$[:alnum:].]*)(?<!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$[:alpha:]][-_$[:alnum:].]*))(?<!\.|-))(?=((<\s*)|(\s+))(?!\?)|\/?>))'
1355+ - match: '(?=(<)\s*(?:([_$[:alpha:]][-$[:alnum:].]*)(?<!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$[:alpha:]][-$[:alnum:].]*))(?<!\.|-))(?=((<\s*)|(\s+))(?!\?)|\/?>))'
1535 push:
1356 push:
1536 - meta_scope: meta.tag.tsx
1357 - meta_scope: meta.tag.tsx
1537− - match: '(/>)|(?:(</)\s*(?:([_$[:alpha:]][-_$[:alnum:].]*)(?<!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$[:alpha:]][-_$[:alnum:].]*))(?<!\.|-))?\s*(>))'
1358+ - match: '(/>)|(?:(</)\s*(?:([_$[:alpha:]][-$[:alnum:].]*)(?<!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$[:alpha:]][-$[:alnum:].]*))(?<!\.|-))?\s*(>))'
1538 captures:
1359 captures:
1539 1: punctuation.definition.tag.end.tsx
1360 1: punctuation.definition.tag.end.tsx
1540 2: punctuation.definition.tag.begin.tsx
1361 2: punctuation.definition.tag.begin.tsx
@@ -1544,7 +1365,7 @@ contexts:
1544 6: support.class.component.tsx
1365 6: support.class.component.tsx
1545 7: punctuation.definition.tag.end.tsx
1366 7: punctuation.definition.tag.end.tsx
1546 pop: true
1367 pop: true
1547− - match: '(<)\s*(?:([_$[:alpha:]][-_$[:alnum:].]*)(?<!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$[:alpha:]][-_$[:alnum:].]*))(?<!\.|-))(?=((<\s*)|(\s+))(?!\?)|\/?>)'
1368+ - match: '(<)\s*(?:([_$[:alpha:]][-$[:alnum:].]*)(?<!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$[:alpha:]][-$[:alnum:].]*))(?<!\.|-))(?=((<\s*)|(\s+))(?!\?)|\/?>)'
1548 captures:
1369 captures:
1549 1: punctuation.definition.tag.begin.tsx
1370 1: punctuation.definition.tag.begin.tsx
1550 2: entity.name.tag.namespace.tsx
1371 2: entity.name.tag.namespace.tsx
@@ -1572,8 +1393,8 @@ contexts:
1572 - match: |-
1393 - match: |-
1573 (?x)
1394 (?x)
1574 \s*
1395 \s*
1575− (?:([_$[:alpha:]][-_$[:alnum:].]*)(:))?
1396+ (?:([_$[:alpha:]][-$[:alnum:].]*)(:))?
1576− ([_$[:alpha:]][-_$[:alnum:]]*)
1397+ ([_$[:alpha:]][-$[:alnum:]]*)
1577 (?=\s|=|/?>|/\*|//)
1398 (?=\s|=|/?>|/\*|//)
1578 captures:
1399 captures:
1579 1: entity.other.attribute-name.namespace.tsx
1400 1: entity.other.attribute-name.namespace.tsx
@@ -1598,15 +1419,15 @@ contexts:
1598 jsx-tag-in-expression:
1419 jsx-tag-in-expression:
1599 - match: |-
1420 - match: |-
1600 (?x)
1421 (?x)
1601− (?<!\+\+|--)(?<=[({\[,?=>:*]|&&|\|\||\?|\*\/|^await|[^\._$[:alnum:]]await|^return|[^\._$[:alnum:]]return|^default|[^\._$[:alnum:]]default|^yield|[^\._$[:alnum:]]yield|^)\s*
1422+ (?<!\+\+|--)(?<=[({\[,?=>:*]|&&|\|\||\?|^await|[^\._$[:alnum:]]await|^return|[^\._$[:alnum:]]return|^default|[^\._$[:alnum:]]default|^yield|[^\._$[:alnum:]]yield|^)\s*
1602 (?!<\s*[_$[:alpha:]][_$[:alnum:]]*((\s+extends\s+[^=>])|,)) # look ahead is not type parameter of arrow
1423 (?!<\s*[_$[:alpha:]][_$[:alnum:]]*((\s+extends\s+[^=>])|,)) # look ahead is not type parameter of arrow
1603− (?=(<)\s*(?:([_$[:alpha:]][-_$[:alnum:].]*)(?<!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$[:alpha:]][-_$[:alnum:].]*))(?<!\.|-))(?=((<\s*)|(\s+))(?!\?)|\/?>))
1424+ (?=(<)\s*(?:([_$[:alpha:]][-$[:alnum:].]*)(?<!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$[:alpha:]][-$[:alnum:].]*))(?<!\.|-))(?=((<\s*)|(\s+))(?!\?)|\/?>))
1604 push:
1425 push:
1605− - match: '(?!(<)\s*(?:([_$[:alpha:]][-_$[:alnum:].]*)(?<!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$[:alpha:]][-_$[:alnum:].]*))(?<!\.|-))(?=((<\s*)|(\s+))(?!\?)|\/?>))'
1426+ - match: '(?!(<)\s*(?:([_$[:alpha:]][-$[:alnum:].]*)(?<!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$[:alpha:]][-$[:alnum:].]*))(?<!\.|-))(?=((<\s*)|(\s+))(?!\?)|\/?>))'
1606 pop: true
1427 pop: true
1607 - include: jsx-tag
1428 - include: jsx-tag
1608 jsx-tag-without-attributes:
1429 jsx-tag-without-attributes:
1609− - match: '(<)\s*(?:([_$[:alpha:]][-_$[:alnum:].]*)(?<!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$[:alpha:]][-_$[:alnum:].]*))(?<!\.|-))?\s*(>)'
1430+ - match: '(<)\s*(?:([_$[:alpha:]][-$[:alnum:].]*)(?<!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$[:alpha:]][-$[:alnum:].]*))(?<!\.|-))?\s*(>)'
1610 captures:
1431 captures:
1611 1: punctuation.definition.tag.begin.tsx
1432 1: punctuation.definition.tag.begin.tsx
1612 2: entity.name.tag.namespace.tsx
1433 2: entity.name.tag.namespace.tsx
@@ -1617,7 +1438,7 @@ contexts:
1617 push:
1438 push:
1618 - meta_scope: meta.tag.without-attributes.tsx
1439 - meta_scope: meta.tag.without-attributes.tsx
1619 - meta_content_scope: meta.jsx.children.tsx
1440 - meta_content_scope: meta.jsx.children.tsx
1620− - match: '(</)\s*(?:([_$[:alpha:]][-_$[:alnum:].]*)(?<!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$[:alpha:]][-_$[:alnum:].]*))(?<!\.|-))?\s*(>)'
1441+ - match: '(</)\s*(?:([_$[:alpha:]][-$[:alnum:].]*)(?<!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$[:alpha:]][-$[:alnum:].]*))(?<!\.|-))?\s*(>)'
1621 captures:
1442 captures:
1622 1: punctuation.definition.tag.begin.tsx
1443 1: punctuation.definition.tag.begin.tsx
1623 2: entity.name.tag.namespace.tsx
1444 2: entity.name.tag.namespace.tsx
@@ -1628,9 +1449,9 @@ contexts:
1628 pop: true
1449 pop: true
1629 - include: jsx-children
1450 - include: jsx-children
1630 jsx-tag-without-attributes-in-expression:
1451 jsx-tag-without-attributes-in-expression:
1631− - match: '(?<!\+\+|--)(?<=[({\[,?=>:*]|&&|\|\||\?|\*\/|^await|[^\._$[:alnum:]]await|^return|[^\._$[:alnum:]]return|^default|[^\._$[:alnum:]]default|^yield|[^\._$[:alnum:]]yield|^)\s*(?=(<)\s*(?:([_$[:alpha:]][-_$[:alnum:].]*)(?<!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$[:alpha:]][-_$[:alnum:].]*))(?<!\.|-))?\s*(>))'
1452+ - match: '(?<!\+\+|--)(?<=[({\[,?=>:*]|&&|\|\||\?|^await|[^\._$[:alnum:]]await|^return|[^\._$[:alnum:]]return|^default|[^\._$[:alnum:]]default|^yield|[^\._$[:alnum:]]yield|^)\s*(?=(<)\s*(?:([_$[:alpha:]][-$[:alnum:].]*)(?<!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$[:alpha:]][-$[:alnum:].]*))(?<!\.|-))?\s*(>))'
1632 push:
1453 push:
1633− - match: '(?!(<)\s*(?:([_$[:alpha:]][-_$[:alnum:].]*)(?<!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$[:alpha:]][-_$[:alnum:].]*))(?<!\.|-))?\s*(>))'
1454+ - match: '(?!(<)\s*(?:([_$[:alpha:]][-$[:alnum:].]*)(?<!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$[:alpha:]][-$[:alnum:].]*))(?<!\.|-))?\s*(>))'
1634 pop: true
1455 pop: true
1635 - include: jsx-tag-without-attributes
1456 - include: jsx-tag-without-attributes
1636 label:
1457 label:
@@ -1656,27 +1477,25 @@ contexts:
1656 - include: this-literal
1477 - include: this-literal
1657 - include: super-literal
1478 - include: super-literal
1658 method-declaration:
1479 method-declaration:
1659− - match: '(?x)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:\b(override)\s+)?(?:\b(public|private|protected)\s+)?(?:\b(abstract)\s+)?(?:\b(async)\s+)?\s*\b(constructor)\b(?!:)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
1480+ - match: '(?x)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:\b(public|private|protected)\s+)?(?:\b(abstract)\s+)?(?:\b(async)\s+)?\s*\b(constructor)\b(?!:)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
1660 captures:
1481 captures:
1661 1: storage.modifier.tsx
1482 1: storage.modifier.tsx
1662 2: storage.modifier.tsx
1483 2: storage.modifier.tsx
1663− 3: storage.modifier.tsx
1484+ 3: storage.modifier.async.tsx
1664− 4: storage.modifier.async.tsx
1485+ 4: storage.type.tsx
1665− 5: storage.type.tsx
1666 push:
1486 push:
1667 - meta_scope: meta.method.declaration.tsx
1487 - meta_scope: meta.method.declaration.tsx
1668 - match: '(?=\}|;|,|$)|(?<=\})'
1488 - match: '(?=\}|;|,|$)|(?<=\})'
1669 pop: true
1489 pop: true
1670 - include: method-declaration-name
1490 - include: method-declaration-name
1671 - include: function-body
1491 - include: function-body
1672− - match: '(?x)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:\b(override)\s+)?(?:\b(public|private|protected)\s+)?(?:\b(abstract)\s+)?(?:\b(async)\s+)?(?:(?:\s*\b(new)\b(?!:)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.)))|(?:(\*)\s*)?)(?=\s*((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*))?[\(])'
1492+ - match: '(?x)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:\b(public|private|protected)\s+)?(?:\b(abstract)\s+)?(?:\b(async)\s+)?(?:(?:\s*\b(new)\b(?!:)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.)))|(?:(\*)\s*)?)(?=\s*[\(\<])'
1673 captures:
1493 captures:
1674 1: storage.modifier.tsx
1494 1: storage.modifier.tsx
1675 2: storage.modifier.tsx
1495 2: storage.modifier.tsx
1676− 3: storage.modifier.tsx
1496+ 3: storage.modifier.async.tsx
1677− 4: storage.modifier.async.tsx
1497+ 4: keyword.operator.new.tsx
1678− 5: keyword.operator.new.tsx
1498+ 5: keyword.generator.asterisk.tsx
1679− 6: keyword.generator.asterisk.tsx
1680 push:
1499 push:
1681 - meta_scope: meta.method.declaration.tsx
1500 - meta_scope: meta.method.declaration.tsx
1682 - match: '(?=\}|;|,|$)|(?<=\})'
1501 - match: '(?=\}|;|,|$)|(?<=\})'
@@ -1684,23 +1503,22 @@ contexts:
1684 - include: method-declaration-name
1503 - include: method-declaration-name
1685 - include: function-body
1504 - include: function-body
1686 - match: |-
1505 - match: |-
1687− (?x)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:\b(override)\s+)?(?:\b(public|private|protected)\s+)?(?:\b(abstract)\s+)?(?:\b(async)\s+)?(?:\b(get|set)\s+)?(?:(\*)\s*)?(?=\s*(((\b(?<!\$)0(?:x|X)[0-9a-fA-F][0-9a-fA-F_]*(n)?\b(?!\$))|(\b(?<!\$)0(?:b|B)[01][01_]*(n)?\b(?!\$))|(\b(?<!\$)0(?:o|O)?[0-7][0-7_]*(n)?\b(?!\$))|((?<!\$)(?:
1506+ (?x)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:\b(public|private|protected)\s+)?(?:\b(abstract)\s+)?(?:\b(async)\s+)?(?:\b(get|set)\s+)?(?:(\*)\s*)?(?=\s*(((\b(?<!\$)0(x|X)[0-9a-fA-F][0-9a-fA-F_]*\b(?!\$))|(\b(?<!\$)0(b|B)[01][01_]*\b(?!\$))|(\b(?<!\$)0(o|O)?[0-7][0-7_]*\b(?!\$))|((?<!\$)(?:
1688− (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1.1E+3
1507+ (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # 1.1E+3
1689− (?:\b[0-9][0-9_]*(\.)[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1.E+3
1508+ (?:\b[0-9][0-9_]*(\.)[eE][+-]?[0-9][0-9_]*\b)| # 1.E+3
1690− (?:\B(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # .1E+3
1509+ (?:\B(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # .1E+3
1691− (?:\b[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1E+3
1510+ (?:\b[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # 1E+3
1692− (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*(n)?\b)| # 1.1
1511+ (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*\b)| # 1.1
1693− (?:\b[0-9][0-9_]*(\.)(n)?\B)| # 1.
1512+ (?:\b[0-9][0-9_]*(\.)\B)| # 1.
1694− (?:\B(\.)[0-9][0-9_]*(n)?\b)| # .1
1513+ (?:\B(\.)[0-9][0-9_]*\b)| # .1
1695− (?:\b[0-9][0-9_]*(n)?\b(?!\.)) # 1
1514+ (?:\b[0-9][0-9_]*\b(?!\.)) # 1
1696− )(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`)|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(\??))\s*((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*))?[\(])
1515+ )(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\\'|\\)*\')|(\"([^\"\\]|\\\"|\\)*\")|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(\??))\s*[\(\<])
1697 captures:
1516 captures:
1698 1: storage.modifier.tsx
1517 1: storage.modifier.tsx
1699 2: storage.modifier.tsx
1518 2: storage.modifier.tsx
1700− 3: storage.modifier.tsx
1519+ 3: storage.modifier.async.tsx
1701− 4: storage.modifier.async.tsx
1520+ 4: storage.type.property.tsx
1702− 5: storage.type.property.tsx
1521+ 5: keyword.generator.asterisk.tsx
1703− 6: keyword.generator.asterisk.tsx
1704 push:
1522 push:
1705 - meta_scope: meta.method.declaration.tsx
1523 - meta_scope: meta.method.declaration.tsx
1706 - match: '(?=\}|;|,|$)|(?<=\})'
1524 - match: '(?=\}|;|,|$)|(?<=\})'
@@ -1709,16 +1527,16 @@ contexts:
1709 - include: function-body
1527 - include: function-body
1710 method-declaration-name:
1528 method-declaration-name:
1711 - match: |-
1529 - match: |-
1712− (?x)(?=((\b(?<!\$)0(?:x|X)[0-9a-fA-F][0-9a-fA-F_]*(n)?\b(?!\$))|(\b(?<!\$)0(?:b|B)[01][01_]*(n)?\b(?!\$))|(\b(?<!\$)0(?:o|O)?[0-7][0-7_]*(n)?\b(?!\$))|((?<!\$)(?:
1530+ (?x)(?=((\b(?<!\$)0(x|X)[0-9a-fA-F][0-9a-fA-F_]*\b(?!\$))|(\b(?<!\$)0(b|B)[01][01_]*\b(?!\$))|(\b(?<!\$)0(o|O)?[0-7][0-7_]*\b(?!\$))|((?<!\$)(?:
1713− (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1.1E+3
1531+ (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # 1.1E+3
1714− (?:\b[0-9][0-9_]*(\.)[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1.E+3
1532+ (?:\b[0-9][0-9_]*(\.)[eE][+-]?[0-9][0-9_]*\b)| # 1.E+3
1715− (?:\B(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # .1E+3
1533+ (?:\B(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # .1E+3
1716− (?:\b[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1E+3
1534+ (?:\b[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # 1E+3
1717− (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*(n)?\b)| # 1.1
1535+ (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*\b)| # 1.1
1718− (?:\b[0-9][0-9_]*(\.)(n)?\B)| # 1.
1536+ (?:\b[0-9][0-9_]*(\.)\B)| # 1.
1719− (?:\B(\.)[0-9][0-9_]*(n)?\b)| # .1
1537+ (?:\B(\.)[0-9][0-9_]*\b)| # .1
1720− (?:\b[0-9][0-9_]*(n)?\b(?!\.)) # 1
1538+ (?:\b[0-9][0-9_]*\b(?!\.)) # 1
1721− )(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`)|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(\??)\s*[\(\<])
1539+ )(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\\'|\\)*\')|(\"([^\"\\]|\\\"|\\)*\")|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(\??)\s*[\(\<])
1722 push:
1540 push:
1723 - match: (?=\(|\<)
1541 - match: (?=\(|\<)
1724 pop: true
1542 pop: true
@@ -1730,14 +1548,13 @@ contexts:
1730 - match: \?
1548 - match: \?
1731 scope: keyword.operator.optional.tsx
1549 scope: keyword.operator.optional.tsx
1732 namespace-declaration:
1550 namespace-declaration:
1733− - match: '(?:(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(namespace|module)\s+(?=[_$[:alpha:]"''`]))'
1551+ - match: '(?:(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?\b(namespace|module)\s+(?=[_$[:alpha:]"''`]))'
1734 captures:
1552 captures:
1735 1: keyword.control.export.tsx
1553 1: keyword.control.export.tsx
1736− 2: storage.modifier.tsx
1554+ 2: storage.type.namespace.tsx
1737− 3: storage.type.namespace.tsx
1738 push:
1555 push:
1739 - meta_scope: meta.namespace.declaration.tsx
1556 - meta_scope: meta.namespace.declaration.tsx
1740− - match: '(?<=\})|(?=;|^\s*$|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))'
1557+ - match: '(?<=\})|(?=;|^\s*abstract\b|^\s*async\b|^\s*class\b|^\s*const\b|^\s*declare\b|^\s*enum\b|^\s*export\b|^\s*function\b|^\s*import\b|^\s*interface\b|^\s*let\b|^\s*module\b|^\s*namespace\b|^\s*return\b|^\s*type\b|^\s*var\b)'
1741 pop: true
1558 pop: true
1742 - include: comment
1559 - include: comment
1743 - include: string
1560 - include: string
@@ -1751,53 +1568,41 @@ contexts:
1751 1: keyword.operator.new.tsx
1568 1: keyword.operator.new.tsx
1752 push:
1569 push:
1753 - meta_scope: new.expr.tsx
1570 - meta_scope: new.expr.tsx
1754− - match: '(?<=\))|(?=[;),}\]:?\-\+\>]|\|\||\&\&|\!\=\=|$|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))new(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.)))|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))function((\s+[_$[:alpha:]][_$[:alnum:]]*)|(\s*[\(]))))'
1571+ - match: '(?<=\))|(?=[;),}\]:]|\|\||\&\&|$|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))new(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.)))|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))function((\s+[_$[:alpha:]][_$[:alnum:]]*)|(\s*[\(]))))'
1755 pop: true
1572 pop: true
1756− - include: expression
1573+ - include: paren-expression
1574+ - include: class-declaration
1575+ - include: type
1757 null-literal:
1576 null-literal:
1758 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))null(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
1577 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))null(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
1759 scope: constant.language.null.tsx
1578 scope: constant.language.null.tsx
1760 numeric-literal:
1579 numeric-literal:
1761− - match: '\b(?<!\$)0(?:x|X)[0-9a-fA-F][0-9a-fA-F_]*(n)?\b(?!\$)'
1580+ - match: '\b(?<!\$)0(x|X)[0-9a-fA-F][0-9a-fA-F_]*\b(?!\$)'
1762 scope: constant.numeric.hex.tsx
1581 scope: constant.numeric.hex.tsx
1763− captures:
1582+ - match: '\b(?<!\$)0(b|B)[01][01_]*\b(?!\$)'
1764− 1: storage.type.numeric.bigint.tsx
1765− - match: '\b(?<!\$)0(?:b|B)[01][01_]*(n)?\b(?!\$)'
1766 scope: constant.numeric.binary.tsx
1583 scope: constant.numeric.binary.tsx
1767− captures:
1584+ - match: '\b(?<!\$)0(o|O)?[0-7][0-7_]*\b(?!\$)'
1768− 1: storage.type.numeric.bigint.tsx
1769− - match: '\b(?<!\$)0(?:o|O)?[0-7][0-7_]*(n)?\b(?!\$)'
1770 scope: constant.numeric.octal.tsx
1585 scope: constant.numeric.octal.tsx
1771− captures:
1772− 1: storage.type.numeric.bigint.tsx
1773 - match: |-
1586 - match: |-
1774 (?x)
1587 (?x)
1775 (?<!\$)(?:
1588 (?<!\$)(?:
1776− (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1.1E+3
1589+ (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # 1.1E+3
1777− (?:\b[0-9][0-9_]*(\.)[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1.E+3
1590+ (?:\b[0-9][0-9_]*(\.)[eE][+-]?[0-9][0-9_]*\b)| # 1.E+3
1778− (?:\B(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # .1E+3
1591+ (?:\B(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # .1E+3
1779− (?:\b[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1E+3
1592+ (?:\b[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # 1E+3
1780− (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*(n)?\b)| # 1.1
1593+ (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*\b)| # 1.1
1781− (?:\b[0-9][0-9_]*(\.)(n)?\B)| # 1.
1594+ (?:\b[0-9][0-9_]*(\.)\B)| # 1.
1782− (?:\B(\.)[0-9][0-9_]*(n)?\b)| # .1
1595+ (?:\B(\.)[0-9][0-9_]*\b)| # .1
1783− (?:\b[0-9][0-9_]*(n)?\b(?!\.)) # 1
1596+ (?:\b[0-9][0-9_]*\b(?!\.)) # 1
1784 )(?!\$)
1597 )(?!\$)
1785 captures:
1598 captures:
1786 0: constant.numeric.decimal.tsx
1599 0: constant.numeric.decimal.tsx
1787 1: meta.delimiter.decimal.period.tsx
1600 1: meta.delimiter.decimal.period.tsx
1788− 2: storage.type.numeric.bigint.tsx
1601+ 2: meta.delimiter.decimal.period.tsx
1789 3: meta.delimiter.decimal.period.tsx
1602 3: meta.delimiter.decimal.period.tsx
1790− 4: storage.type.numeric.bigint.tsx
1603+ 4: meta.delimiter.decimal.period.tsx
1791 5: meta.delimiter.decimal.period.tsx
1604 5: meta.delimiter.decimal.period.tsx
1792− 6: storage.type.numeric.bigint.tsx
1605+ 6: meta.delimiter.decimal.period.tsx
1793− 7: storage.type.numeric.bigint.tsx
1794− 8: meta.delimiter.decimal.period.tsx
1795− 9: storage.type.numeric.bigint.tsx
1796− 10: meta.delimiter.decimal.period.tsx
1797− 11: storage.type.numeric.bigint.tsx
1798− 12: meta.delimiter.decimal.period.tsx
1799− 13: storage.type.numeric.bigint.tsx
1800− 14: storage.type.numeric.bigint.tsx
1801 numericConstant-literal:
1606 numericConstant-literal:
1802 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))NaN(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
1607 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))NaN(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
1803 scope: constant.language.nan.tsx
1608 scope: constant.language.nan.tsx
@@ -1806,16 +1611,16 @@ contexts:
1806 object-binding-element:
1611 object-binding-element:
1807 - include: comment
1612 - include: comment
1808 - match: |-
1613 - match: |-
1809− (?x)(?=((\b(?<!\$)0(?:x|X)[0-9a-fA-F][0-9a-fA-F_]*(n)?\b(?!\$))|(\b(?<!\$)0(?:b|B)[01][01_]*(n)?\b(?!\$))|(\b(?<!\$)0(?:o|O)?[0-7][0-7_]*(n)?\b(?!\$))|((?<!\$)(?:
1614+ (?x)(?=((\b(?<!\$)0(x|X)[0-9a-fA-F][0-9a-fA-F_]*\b(?!\$))|(\b(?<!\$)0(b|B)[01][01_]*\b(?!\$))|(\b(?<!\$)0(o|O)?[0-7][0-7_]*\b(?!\$))|((?<!\$)(?:
1810− (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1.1E+3
1615+ (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # 1.1E+3
1811− (?:\b[0-9][0-9_]*(\.)[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1.E+3
1616+ (?:\b[0-9][0-9_]*(\.)[eE][+-]?[0-9][0-9_]*\b)| # 1.E+3
1812− (?:\B(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # .1E+3
1617+ (?:\B(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # .1E+3
1813− (?:\b[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1E+3
1618+ (?:\b[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # 1E+3
1814− (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*(n)?\b)| # 1.1
1619+ (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*\b)| # 1.1
1815− (?:\b[0-9][0-9_]*(\.)(n)?\B)| # 1.
1620+ (?:\b[0-9][0-9_]*(\.)\B)| # 1.
1816− (?:\B(\.)[0-9][0-9_]*(n)?\b)| # .1
1621+ (?:\B(\.)[0-9][0-9_]*\b)| # .1
1817− (?:\b[0-9][0-9_]*(n)?\b(?!\.)) # 1
1622+ (?:\b[0-9][0-9_]*\b(?!\.)) # 1
1818− )(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`)|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(:))
1623+ )(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\\'|\\)*\')|(\"([^\"\\]|\\\"|\\)*\")|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(:))
1819 push:
1624 push:
1820 - match: '(?=,|\})'
1625 - match: '(?=,|\})'
1821 pop: true
1626 pop: true
@@ -1828,16 +1633,16 @@ contexts:
1828 object-binding-element-const:
1633 object-binding-element-const:
1829 - include: comment
1634 - include: comment
1830 - match: |-
1635 - match: |-
1831− (?x)(?=((\b(?<!\$)0(?:x|X)[0-9a-fA-F][0-9a-fA-F_]*(n)?\b(?!\$))|(\b(?<!\$)0(?:b|B)[01][01_]*(n)?\b(?!\$))|(\b(?<!\$)0(?:o|O)?[0-7][0-7_]*(n)?\b(?!\$))|((?<!\$)(?:
1636+ (?x)(?=((\b(?<!\$)0(x|X)[0-9a-fA-F][0-9a-fA-F_]*\b(?!\$))|(\b(?<!\$)0(b|B)[01][01_]*\b(?!\$))|(\b(?<!\$)0(o|O)?[0-7][0-7_]*\b(?!\$))|((?<!\$)(?:
1832− (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1.1E+3
1637+ (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # 1.1E+3
1833− (?:\b[0-9][0-9_]*(\.)[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1.E+3
1638+ (?:\b[0-9][0-9_]*(\.)[eE][+-]?[0-9][0-9_]*\b)| # 1.E+3
1834− (?:\B(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # .1E+3
1639+ (?:\B(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # .1E+3
1835− (?:\b[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1E+3
1640+ (?:\b[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # 1E+3
1836− (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*(n)?\b)| # 1.1
1641+ (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*\b)| # 1.1
1837− (?:\b[0-9][0-9_]*(\.)(n)?\B)| # 1.
1642+ (?:\b[0-9][0-9_]*(\.)\B)| # 1.
1838− (?:\B(\.)[0-9][0-9_]*(n)?\b)| # .1
1643+ (?:\B(\.)[0-9][0-9_]*\b)| # .1
1839− (?:\b[0-9][0-9_]*(n)?\b(?!\.)) # 1
1644+ (?:\b[0-9][0-9_]*\b(?!\.)) # 1
1840− )(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`)|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(:))
1645+ )(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\\'|\\)*\')|(\"([^\"\\]|\\\"|\\)*\")|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(:))
1841 push:
1646 push:
1842 - match: '(?=,|\})'
1647 - match: '(?=,|\})'
1843 pop: true
1648 pop: true
@@ -1849,16 +1654,16 @@ contexts:
1849 - include: punctuation-comma
1654 - include: punctuation-comma
1850 object-binding-element-propertyName:
1655 object-binding-element-propertyName:
1851 - match: |-
1656 - match: |-
1852− (?x)(?=((\b(?<!\$)0(?:x|X)[0-9a-fA-F][0-9a-fA-F_]*(n)?\b(?!\$))|(\b(?<!\$)0(?:b|B)[01][01_]*(n)?\b(?!\$))|(\b(?<!\$)0(?:o|O)?[0-7][0-7_]*(n)?\b(?!\$))|((?<!\$)(?:
1657+ (?x)(?=((\b(?<!\$)0(x|X)[0-9a-fA-F][0-9a-fA-F_]*\b(?!\$))|(\b(?<!\$)0(b|B)[01][01_]*\b(?!\$))|(\b(?<!\$)0(o|O)?[0-7][0-7_]*\b(?!\$))|((?<!\$)(?:
1853− (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1.1E+3
1658+ (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # 1.1E+3
1854− (?:\b[0-9][0-9_]*(\.)[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1.E+3
1659+ (?:\b[0-9][0-9_]*(\.)[eE][+-]?[0-9][0-9_]*\b)| # 1.E+3
1855− (?:\B(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # .1E+3
1660+ (?:\B(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # .1E+3
1856− (?:\b[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1E+3
1661+ (?:\b[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # 1E+3
1857− (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*(n)?\b)| # 1.1
1662+ (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*\b)| # 1.1
1858− (?:\b[0-9][0-9_]*(\.)(n)?\B)| # 1.
1663+ (?:\b[0-9][0-9_]*(\.)\B)| # 1.
1859− (?:\B(\.)[0-9][0-9_]*(n)?\b)| # .1
1664+ (?:\B(\.)[0-9][0-9_]*\b)| # .1
1860− (?:\b[0-9][0-9_]*(n)?\b(?!\.)) # 1
1665+ (?:\b[0-9][0-9_]*\b(?!\.)) # 1
1861− )(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`)|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(:))
1666+ )(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\\'|\\)*\')|(\"([^\"\\]|\\\"|\\)*\")|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(:))
1862 push:
1667 push:
1863 - match: (:)
1668 - match: (:)
1864 captures:
1669 captures:
@@ -1896,9 +1701,9 @@ contexts:
1896 scope: support.class.tsx
1701 scope: support.class.tsx
1897 - match: |-
1702 - match: |-
1898 (?x)(?:(\.)|(\?\.(?!\s*[[:digit:]])))\s*(?:
1703 (?x)(?:(\.)|(\?\.(?!\s*[[:digit:]])))\s*(?:
1899− (\#?[[:upper:]][_$[:digit:][:upper:]]*) |
1704+ ([[:upper:]][_$[:digit:][:upper:]]*) |
1900− (\#?[_$[:alpha:]][_$[:alnum:]]*)
1705+ ([_$[:alpha:]][_$[:alnum:]]*)
1901− )(?=\s*\??\.\s*\#?[_$[:alpha:]][_$[:alnum:]]*)
1706+ )(?=\s*\??\.\s*[_$[:alpha:]][_$[:alnum:]]*)
1902 captures:
1707 captures:
1903 1: punctuation.accessor.tsx
1708 1: punctuation.accessor.tsx
1904 2: punctuation.accessor.optional.tsx
1709 2: punctuation.accessor.optional.tsx
@@ -1908,7 +1713,7 @@ contexts:
1908 (?x)(?:
1713 (?x)(?:
1909 ([[:upper:]][_$[:digit:][:upper:]]*) |
1714 ([[:upper:]][_$[:digit:][:upper:]]*) |
1910 ([_$[:alpha:]][_$[:alnum:]]*)
1715 ([_$[:alpha:]][_$[:alnum:]]*)
1911− )(?=\s*\??\.\s*\#?[_$[:alpha:]][_$[:alnum:]]*)
1716+ )(?=\s*\??\.\s*[_$[:alpha:]][_$[:alnum:]]*)
1912 captures:
1717 captures:
1913 1: variable.other.constant.object.tsx
1718 1: variable.other.constant.object.tsx
1914 2: variable.other.object.tsx
1719 2: variable.other.object.tsx
@@ -1925,16 +1730,16 @@ contexts:
1925 - include: object-member
1730 - include: object-member
1926 object-literal-method-declaration:
1731 object-literal-method-declaration:
1927 - match: |-
1732 - match: |-
1928− (?x)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:\b(async)\s+)?(?:\b(get|set)\s+)?(?:(\*)\s*)?(?=\s*(((\b(?<!\$)0(?:x|X)[0-9a-fA-F][0-9a-fA-F_]*(n)?\b(?!\$))|(\b(?<!\$)0(?:b|B)[01][01_]*(n)?\b(?!\$))|(\b(?<!\$)0(?:o|O)?[0-7][0-7_]*(n)?\b(?!\$))|((?<!\$)(?:
1733+ (?x)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:\b(async)\s+)?(?:\b(get|set)\s+)?(?:(\*)\s*)?(?=\s*(((\b(?<!\$)0(x|X)[0-9a-fA-F][0-9a-fA-F_]*\b(?!\$))|(\b(?<!\$)0(b|B)[01][01_]*\b(?!\$))|(\b(?<!\$)0(o|O)?[0-7][0-7_]*\b(?!\$))|((?<!\$)(?:
1929− (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1.1E+3
1734+ (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # 1.1E+3
1930− (?:\b[0-9][0-9_]*(\.)[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1.E+3
1735+ (?:\b[0-9][0-9_]*(\.)[eE][+-]?[0-9][0-9_]*\b)| # 1.E+3
1931− (?:\B(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # .1E+3
1736+ (?:\B(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # .1E+3
1932− (?:\b[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1E+3
1737+ (?:\b[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # 1E+3
1933− (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*(n)?\b)| # 1.1
1738+ (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*\b)| # 1.1
1934− (?:\b[0-9][0-9_]*(\.)(n)?\B)| # 1.
1739+ (?:\b[0-9][0-9_]*(\.)\B)| # 1.
1935− (?:\B(\.)[0-9][0-9_]*(n)?\b)| # .1
1740+ (?:\B(\.)[0-9][0-9_]*\b)| # .1
1936− (?:\b[0-9][0-9_]*(n)?\b(?!\.)) # 1
1741+ (?:\b[0-9][0-9_]*\b(?!\.)) # 1
1937− )(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`)|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(\??))\s*((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*))?[\(])
1742+ )(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\\'|\\)*\')|(\"([^\"\\]|\\\"|\\)*\")|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(\??))\s*[\(\<])
1938 captures:
1743 captures:
1939 1: storage.modifier.async.tsx
1744 1: storage.modifier.async.tsx
1940 2: storage.type.property.tsx
1745 2: storage.type.property.tsx
@@ -1946,16 +1751,16 @@ contexts:
1946 - include: method-declaration-name
1751 - include: method-declaration-name
1947 - include: function-body
1752 - include: function-body
1948 - match: |-
1753 - match: |-
1949− (?x)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:\b(async)\s+)?(?:\b(get|set)\s+)?(?:(\*)\s*)?(?=\s*(((\b(?<!\$)0(?:x|X)[0-9a-fA-F][0-9a-fA-F_]*(n)?\b(?!\$))|(\b(?<!\$)0(?:b|B)[01][01_]*(n)?\b(?!\$))|(\b(?<!\$)0(?:o|O)?[0-7][0-7_]*(n)?\b(?!\$))|((?<!\$)(?:
1754+ (?x)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:\b(async)\s+)?(?:\b(get|set)\s+)?(?:(\*)\s*)?(?=\s*(((\b(?<!\$)0(x|X)[0-9a-fA-F][0-9a-fA-F_]*\b(?!\$))|(\b(?<!\$)0(b|B)[01][01_]*\b(?!\$))|(\b(?<!\$)0(o|O)?[0-7][0-7_]*\b(?!\$))|((?<!\$)(?:
1950− (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1.1E+3
1755+ (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # 1.1E+3
1951− (?:\b[0-9][0-9_]*(\.)[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1.E+3
1756+ (?:\b[0-9][0-9_]*(\.)[eE][+-]?[0-9][0-9_]*\b)| # 1.E+3
1952− (?:\B(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # .1E+3
1757+ (?:\B(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # .1E+3
1953− (?:\b[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1E+3
1758+ (?:\b[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # 1E+3
1954− (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*(n)?\b)| # 1.1
1759+ (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*\b)| # 1.1
1955− (?:\b[0-9][0-9_]*(\.)(n)?\B)| # 1.
1760+ (?:\b[0-9][0-9_]*(\.)\B)| # 1.
1956− (?:\B(\.)[0-9][0-9_]*(n)?\b)| # .1
1761+ (?:\B(\.)[0-9][0-9_]*\b)| # .1
1957− (?:\b[0-9][0-9_]*(n)?\b(?!\.)) # 1
1762+ (?:\b[0-9][0-9_]*\b(?!\.)) # 1
1958− )(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`)|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(\??))\s*((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*))?[\(])
1763+ )(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\\'|\\)*\')|(\"([^\"\\]|\\\"|\\)*\")|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(\??))\s*[\(\<])
1959 captures:
1764 captures:
1960 1: storage.modifier.async.tsx
1765 1: storage.modifier.async.tsx
1961 2: storage.type.property.tsx
1766 2: storage.type.property.tsx
@@ -1972,56 +1777,37 @@ contexts:
1972 - meta_scope: meta.object.member.tsx meta.object-literal.key.tsx
1777 - meta_scope: meta.object.member.tsx meta.object-literal.key.tsx
1973 - match: '(?=:)|((?<=[\]])(?=\s*[\(\<]))'
1778 - match: '(?=:)|((?<=[\]])(?=\s*[\(\<]))'
1974 pop: true
1779 pop: true
1975− - include: comment
1976 - include: array-literal
1780 - include: array-literal
1977− - match: '(?=[\''\"\`])'
1781+ - match: '(?=[\''\"])'
1978 push:
1782 push:
1979 - meta_scope: meta.object.member.tsx meta.object-literal.key.tsx
1783 - meta_scope: meta.object.member.tsx meta.object-literal.key.tsx
1980− - match: '(?=:)|((?<=[\''\"\`])(?=((\s*[\(\<,}])|(\s+(as)\s+))))'
1784+ - match: '(?=:)|((?<=[\''\"])(?=\s*[\(\<]))'
1981 pop: true
1785 pop: true
1982− - include: comment
1983 - include: string
1786 - include: string
1984− - match: |-
1787+ - match: '(?<=[\]\''\"])(?=\s*[\(\<])'
1985− (?x)(?=(\b(?<!\$)0(?:x|X)[0-9a-fA-F][0-9a-fA-F_]*(n)?\b(?!\$))|(\b(?<!\$)0(?:b|B)[01][01_]*(n)?\b(?!\$))|(\b(?<!\$)0(?:o|O)?[0-7][0-7_]*(n)?\b(?!\$))|((?<!\$)(?:
1986− (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1.1E+3
1987− (?:\b[0-9][0-9_]*(\.)[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1.E+3
1988− (?:\B(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # .1E+3
1989− (?:\b[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1E+3
1990− (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*(n)?\b)| # 1.1
1991− (?:\b[0-9][0-9_]*(\.)(n)?\B)| # 1.
1992− (?:\B(\.)[0-9][0-9_]*(n)?\b)| # .1
1993− (?:\b[0-9][0-9_]*(n)?\b(?!\.)) # 1
1994− )(?!\$)))
1995− push:
1996− - meta_scope: meta.object.member.tsx meta.object-literal.key.tsx
1997− - match: '(?=:)|(?=\s*([\(\<,}])|(\s+as\s+))'
1998− pop: true
1999− - include: comment
2000− - include: numeric-literal
2001− - match: '(?<=[\]\''\"\`])(?=\s*[\(\<])'
2002 push:
1788 push:
2003 - meta_scope: meta.method.declaration.tsx
1789 - meta_scope: meta.method.declaration.tsx
2004 - match: '(?=\}|;|,)|(?<=\})'
1790 - match: '(?=\}|;|,)|(?<=\})'
2005 pop: true
1791 pop: true
2006 - include: function-body
1792 - include: function-body
2007− - match: '(?![_$[:alpha:]])([[:digit:]]+)\s*(?=(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*:)'
1793+ - match: '(?![_$[:alpha:]])([[:digit:]]+)\s*(?=:)'
2008 scope: meta.object.member.tsx
1794 scope: meta.object.member.tsx
2009 captures:
1795 captures:
2010 0: meta.object-literal.key.tsx
1796 0: meta.object-literal.key.tsx
2011 1: constant.numeric.decimal.tsx
1797 1: constant.numeric.decimal.tsx
2012 - match: |-
1798 - match: |-
2013− (?x)(?:([_$[:alpha:]][_$[:alnum:]]*)\s*(?=(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*:(\s*\/\*([^\*]|(\*[^\/]))*\*\/)*\s*(
1799+ (?x)(?:([_$[:alpha:]][_$[:alnum:]]*)\s*(?=:\s*(
2014 ((async\s+)?(
1800 ((async\s+)?(
2015 (function\s*[(<*]) |
1801 (function\s*[(<*]) |
2016 (function\s+) |
1802 (function\s+) |
2017 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
1803 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
2018 )) |
1804 )) |
2019 ((async\s*)?(
1805 ((async\s*)?(
2020− ((<\s*$)|([\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
1806+ ((<\s*$)|([\(]\s*([\{\[]\s*)?$)) |
2021 # sure shot arrow functions even if => is on new line
1807 # sure shot arrow functions even if => is on new line
2022 (
1808 (
2023− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
1809+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*>\s*)?
2024− [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
1810+ [(]\s*
2025 (
1811 (
2026 ([)]\s*:) | # ():
1812 ([)]\s*:) | # ():
2027 ((\.\.\.\s*)?[_$[:alpha:]][_$[:alnum:]]*\s*:) # [(]param: | [(]...param:
1813 ((\.\.\.\s*)?[_$[:alpha:]][_$[:alnum:]]*\s*:) # [(]param: | [(]...param:
@@ -2032,9 +1818,9 @@ contexts:
2032 ) |
1818 ) |
2033 # arrow function possible to detect only with => on same line
1819 # arrow function possible to detect only with => on same line
2034 (
1820 (
2035− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
1821+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*>\s*)? # typeparameters
2036− \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
1822+ \(\s*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()]|(\(([^\(\)]|(\([^\(\)]*\)))*\)))*)?\) # parameters
2037− (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
1823+ (\s*:\s*([^<>\(\)]|\<[^<>]+\>|\([^\(\)]+\))+)? # return type
2038 \s*=> # arrow operator
1824 \s*=> # arrow operator
2039 )
1825 )
2040 ))
1826 ))
@@ -2043,7 +1829,7 @@ contexts:
2043 captures:
1829 captures:
2044 0: meta.object-literal.key.tsx
1830 0: meta.object-literal.key.tsx
2045 1: entity.name.function.tsx
1831 1: entity.name.function.tsx
2046− - match: '(?:[_$[:alpha:]][_$[:alnum:]]*)\s*(?=(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*:)'
1832+ - match: '(?:[_$[:alpha:]][_$[:alnum:]]*)\s*(?=:)'
2047 scope: meta.object.member.tsx
1833 scope: meta.object.member.tsx
2048 captures:
1834 captures:
2049 0: meta.object-literal.key.tsx
1835 0: meta.object-literal.key.tsx
@@ -2055,27 +1841,14 @@ contexts:
2055 - match: '(?=,|\})'
1841 - match: '(?=,|\})'
2056 pop: true
1842 pop: true
2057 - include: expression
1843 - include: expression
2058− - match: '([_$[:alpha:]][_$[:alnum:]]*)\s*(?=,|\}|$|\/\/|\/\*)'
1844+ - match: '([_$[:alpha:]][_$[:alnum:]]*)\s*(?=,|\}|$)'
2059 scope: meta.object.member.tsx
1845 scope: meta.object.member.tsx
2060 captures:
1846 captures:
2061 1: variable.other.readwrite.tsx
1847 1: variable.other.readwrite.tsx
2062− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(as)\s+(const)(?=\s*([,}]|$))'
2063− scope: meta.object.member.tsx
2064− captures:
2065− 1: keyword.control.as.tsx
2066− 2: storage.modifier.tsx
2067− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(as)\s+'
2068− captures:
2069− 1: keyword.control.as.tsx
2070− push:
2071− - meta_scope: meta.object.member.tsx
2072− - match: '(?=[;),}\]:?\-\+\>]|\|\||\&\&|\!\=\=|$|^|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(as)\s+))'
2073− pop: true
2074− - include: type
2075 - match: '(?=[_$[:alpha:]][_$[:alnum:]]*\s*=)'
1848 - match: '(?=[_$[:alpha:]][_$[:alnum:]]*\s*=)'
2076 push:
1849 push:
2077 - meta_scope: meta.object.member.tsx
1850 - meta_scope: meta.object.member.tsx
2078− - match: '(?=,|\}|$|\/\/|\/\*)'
1851+ - match: '(?=,|\}|$)'
2079 pop: true
1852 pop: true
2080 - include: expression
1853 - include: expression
2081 - match: ":"
1854 - match: ":"
@@ -2085,7 +1858,7 @@ contexts:
2085 - meta_scope: meta.object.member.tsx
1858 - meta_scope: meta.object.member.tsx
2086 - match: '(?=,|\})'
1859 - match: '(?=,|\})'
2087 pop: true
1860 pop: true
2088− - match: '(?<=:)\s*(async)?(?=\s*(<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)\(\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))'
1861+ - match: '(?<=:)\s*(async)?(?=\s*(<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*>\s*)\(\s*([\{\[]\s*)?$)'
2089 captures:
1862 captures:
2090 1: storage.modifier.async.tsx
1863 1: storage.modifier.async.tsx
2091 push:
1864 push:
@@ -2101,7 +1874,7 @@ contexts:
2101 0: meta.brace.round.tsx
1874 0: meta.brace.round.tsx
2102 pop: true
1875 pop: true
2103 - include: expression-inside-possibly-arrow-parens
1876 - include: expression-inside-possibly-arrow-parens
2104− - match: '(?<=:)\s*(async)?\s*(\()(?=\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))'
1877+ - match: '(?<=:)\s*(async)?\s*(\()(?=\s*([\{\[]\s*)?$)'
2105 captures:
1878 captures:
2106 1: storage.modifier.async.tsx
1879 1: storage.modifier.async.tsx
2107 2: meta.brace.round.tsx
1880 2: meta.brace.round.tsx
@@ -2111,23 +1884,6 @@ contexts:
2111 0: meta.brace.round.tsx
1884 0: meta.brace.round.tsx
2112 pop: true
1885 pop: true
2113 - include: expression-inside-possibly-arrow-parens
1886 - include: expression-inside-possibly-arrow-parens
2114− - match: (?<=:)\s*(async)?\s*(?=\<\s*$)
2115− captures:
2116− 1: storage.modifier.async.tsx
2117− push:
2118− - match: (?<=\>)
2119− pop: true
2120− - include: type-parameters
2121− - match: '(?<=\>)\s*(\()(?=\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))'
2122− captures:
2123− 1: meta.brace.round.tsx
2124− push:
2125− - match: \)
2126− captures:
2127− 0: meta.brace.round.tsx
2128− pop: true
2129− - include: expression-inside-possibly-arrow-parens
2130− - include: possibly-arrow-return-type
2131 - include: expression
1887 - include: expression
2132 - include: punctuation-comma
1888 - include: punctuation-comma
2133 parameter-array-binding-pattern:
1889 parameter-array-binding-pattern:
@@ -2145,18 +1901,16 @@ contexts:
2145 parameter-binding-element:
1901 parameter-binding-element:
2146 - include: comment
1902 - include: comment
2147 - include: string
1903 - include: string
2148− - include: numeric-literal
2149− - include: regex
2150 - include: parameter-object-binding-pattern
1904 - include: parameter-object-binding-pattern
2151 - include: parameter-array-binding-pattern
1905 - include: parameter-array-binding-pattern
2152 - include: destructuring-parameter-rest
1906 - include: destructuring-parameter-rest
2153 - include: variable-initializer
1907 - include: variable-initializer
2154 parameter-name:
1908 parameter-name:
2155− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(override|public|protected|private|readonly)\s+(?=(override|public|protected|private|readonly)\s+)'
1909+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(public|protected|private|readonly)\s+(?=(public|protected|private|readonly)\s+)'
2156 captures:
1910 captures:
2157 1: storage.modifier.tsx
1911 1: storage.modifier.tsx
2158 - match: |-
1912 - match: |-
2159− (?x)(?:(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(override|public|private|protected|readonly)\s+)?(?:(\.\.\.)\s*)?(?<!=|:)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(this)|([_$[:alpha:]][_$[:alnum:]]*))(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))\s*(\??)(?=\s*
1913+ (?x)(?:(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(public|private|protected|readonly)\s+)?(?:(\.\.\.)\s*)?(?<!=|:)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(this)|([_$[:alpha:]][_$[:alnum:]]*))(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))\s*(\??)(?=\s*
2160 # function assignment |
1914 # function assignment |
2161 (=\s*(
1915 (=\s*(
2162 ((async\s+)?(
1916 ((async\s+)?(
@@ -2165,11 +1919,11 @@ contexts:
2165 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
1919 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
2166 )) |
1920 )) |
2167 ((async\s*)?(
1921 ((async\s*)?(
2168− ((<\s*$)|([\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
1922+ ((<\s*$)|([\(]\s*([\{\[]\s*)?$)) |
2169 # sure shot arrow functions even if => is on new line
1923 # sure shot arrow functions even if => is on new line
2170 (
1924 (
2171− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
1925+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*>\s*)?
2172− [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
1926+ [(]\s*
2173 (
1927 (
2174 ([)]\s*:) | # ():
1928 ([)]\s*:) | # ():
2175 ((\.\.\.\s*)?[_$[:alpha:]][_$[:alnum:]]*\s*:) # [(]param: | [(]...param:
1929 ((\.\.\.\s*)?[_$[:alpha:]][_$[:alnum:]]*\s*:) # [(]param: | [(]...param:
@@ -2180,9 +1934,9 @@ contexts:
2180 ) |
1934 ) |
2181 # arrow function possible to detect only with => on same line
1935 # arrow function possible to detect only with => on same line
2182 (
1936 (
2183− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
1937+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*>\s*)? # typeparameters
2184− \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
1938+ \(\s*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()]|(\(([^\(\)]|(\([^\(\)]*\)))*\)))*)?\) # parameters
2185− (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
1939+ (\s*:\s*([^<>\(\)]|\<[^<>]+\>|\([^\(\)]+\))+)? # return type
2186 \s*=> # arrow operator
1940 \s*=> # arrow operator
2187 )
1941 )
2188 ))
1942 ))
@@ -2199,20 +1953,19 @@ contexts:
2199 ))
1953 ))
2200 ))
1954 ))
2201 )) |
1955 )) |
2202− (:\s*(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))Function(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))) |
1956+ (:\s*((<\s*$)|([\(]\s*([\{\[]\s*)?$))) |
2203− (:\s*((<\s*$)|([\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*))))))) |
1957+ (:\s*(=>|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(<[^<>]*>)|[^<>(),=])+=\s*(
2204− (:\s*(=>|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(<[^<>]*>)|[^<>(),=])+=\s*(
2205 ((async\s+)?(
1958 ((async\s+)?(
2206 (function\s*[(<*]) |
1959 (function\s*[(<*]) |
2207 (function\s+) |
1960 (function\s+) |
2208 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
1961 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
2209 )) |
1962 )) |
2210 ((async\s*)?(
1963 ((async\s*)?(
2211− ((<\s*$)|([\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
1964+ ((<\s*$)|([\(]\s*([\{\[]\s*)?$)) |
2212 # sure shot arrow functions even if => is on new line
1965 # sure shot arrow functions even if => is on new line
2213 (
1966 (
2214− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
1967+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*>\s*)?
2215− [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
1968+ [(]\s*
2216 (
1969 (
2217 ([)]\s*:) | # ():
1970 ([)]\s*:) | # ():
2218 ((\.\.\.\s*)?[_$[:alpha:]][_$[:alnum:]]*\s*:) # [(]param: | [(]...param:
1971 ((\.\.\.\s*)?[_$[:alpha:]][_$[:alnum:]]*\s*:) # [(]param: | [(]...param:
@@ -2223,9 +1976,9 @@ contexts:
2223 ) |
1976 ) |
2224 # arrow function possible to detect only with => on same line
1977 # arrow function possible to detect only with => on same line
2225 (
1978 (
2226− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
1979+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*>\s*)? # typeparameters
2227− \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
1980+ \(\s*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()]|(\(([^\(\)]|(\([^\(\)]*\)))*\)))*)?\) # parameters
2228− (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
1981+ (\s*:\s*([^<>\(\)]|\<[^<>]+\>|\([^\(\)]+\))+)? # return type
2229 \s*=> # arrow operator
1982 \s*=> # arrow operator
2230 )
1983 )
2231 ))
1984 ))
@@ -2236,7 +1989,7 @@ contexts:
2236 3: entity.name.function.tsx variable.language.this.tsx
1989 3: entity.name.function.tsx variable.language.this.tsx
2237 4: entity.name.function.tsx
1990 4: entity.name.function.tsx
2238 5: keyword.operator.optional.tsx
1991 5: keyword.operator.optional.tsx
2239− - match: '(?x)(?:(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(override|public|private|protected|readonly)\s+)?(?:(\.\.\.)\s*)?(?<!=|:)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(this)|([_$[:alpha:]][_$[:alnum:]]*))(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))\s*(\??)'
1992+ - match: '(?x)(?:(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(public|private|protected|readonly)\s+)?(?:(\.\.\.)\s*)?(?<!=|:)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(this)|([_$[:alpha:]][_$[:alnum:]]*))(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))\s*(\??)'
2240 captures:
1993 captures:
2241 1: storage.modifier.tsx
1994 1: storage.modifier.tsx
2242 2: keyword.operator.rest.tsx
1995 2: keyword.operator.rest.tsx
@@ -2246,16 +1999,16 @@ contexts:
2246 parameter-object-binding-element:
1999 parameter-object-binding-element:
2247 - include: comment
2000 - include: comment
2248 - match: |-
2001 - match: |-
2249− (?x)(?=((\b(?<!\$)0(?:x|X)[0-9a-fA-F][0-9a-fA-F_]*(n)?\b(?!\$))|(\b(?<!\$)0(?:b|B)[01][01_]*(n)?\b(?!\$))|(\b(?<!\$)0(?:o|O)?[0-7][0-7_]*(n)?\b(?!\$))|((?<!\$)(?:
2002+ (?x)(?=((\b(?<!\$)0(x|X)[0-9a-fA-F][0-9a-fA-F_]*\b(?!\$))|(\b(?<!\$)0(b|B)[01][01_]*\b(?!\$))|(\b(?<!\$)0(o|O)?[0-7][0-7_]*\b(?!\$))|((?<!\$)(?:
2250− (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1.1E+3
2003+ (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # 1.1E+3
2251− (?:\b[0-9][0-9_]*(\.)[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1.E+3
2004+ (?:\b[0-9][0-9_]*(\.)[eE][+-]?[0-9][0-9_]*\b)| # 1.E+3
2252− (?:\B(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # .1E+3
2005+ (?:\B(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # .1E+3
2253− (?:\b[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)| # 1E+3
2006+ (?:\b[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*\b)| # 1E+3
2254− (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*(n)?\b)| # 1.1
2007+ (?:\b[0-9][0-9_]*(\.)[0-9][0-9_]*\b)| # 1.1
2255− (?:\b[0-9][0-9_]*(\.)(n)?\B)| # 1.
2008+ (?:\b[0-9][0-9_]*(\.)\B)| # 1.
2256− (?:\B(\.)[0-9][0-9_]*(n)?\b)| # .1
2009+ (?:\B(\.)[0-9][0-9_]*\b)| # .1
2257− (?:\b[0-9][0-9_]*(n)?\b(?!\.)) # 1
2010+ (?:\b[0-9][0-9_]*\b(?!\.)) # 1
2258− )(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`)|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(:))
2011+ )(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\\'|\\)*\')|(\"([^\"\\]|\\\"|\\)*\")|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(:))
2259 push:
2012 push:
2260 - match: '(?=,|\})'
2013 - match: '(?=,|\})'
2261 pop: true
2014 pop: true
@@ -2276,15 +2029,6 @@ contexts:
2276 0: punctuation.definition.binding-pattern.object.tsx
2029 0: punctuation.definition.binding-pattern.object.tsx
2277 pop: true
2030 pop: true
2278 - include: parameter-object-binding-element
2031 - include: parameter-object-binding-element
2279− parameter-type-annotation:
2280− - match: (:)
2281− captures:
2282− 1: keyword.operator.type.annotation.tsx
2283− push:
2284− - meta_scope: meta.type.annotation.tsx
2285− - match: "(?=[,)])|(?==[^>])"
2286− pop: true
2287− - include: type
2288 paren-expression:
2032 paren-expression:
2289 - match: \(
2033 - match: \(
2290 captures:
2034 captures:
@@ -2296,14 +2040,14 @@ contexts:
2296 pop: true
2040 pop: true
2297 - include: expression
2041 - include: expression
2298 paren-expression-possibly-arrow:
2042 paren-expression-possibly-arrow:
2299− - match: '(?<=[(=,])\s*(async)?(?=\s*((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*))?\(\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))'
2043+ - match: '(?<=[(=,])\s*(async)?(?=\s*((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*>\s*))?\(\s*[\{\[]\s*$)'
2300 captures:
2044 captures:
2301 1: storage.modifier.async.tsx
2045 1: storage.modifier.async.tsx
2302 push:
2046 push:
2303 - match: (?<=\))
2047 - match: (?<=\))
2304 pop: true
2048 pop: true
2305 - include: paren-expression-possibly-arrow-with-typeparameters
2049 - include: paren-expression-possibly-arrow-with-typeparameters
2306− - match: '(?<=[(=,]|=>|^return|[^\._$[:alnum:]]return)\s*(async)?(?=\s*((((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*))?\()|(<))\s*$)'
2050+ - match: '(?<=[(=,]|=>)\s*(async)?(?=\s*((((<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*>\s*))?\()|(<))\s*$)'
2307 captures:
2051 captures:
2308 1: storage.modifier.async.tsx
2052 1: storage.modifier.async.tsx
2309 push:
2053 push:
@@ -2323,7 +2067,7 @@ contexts:
2323 pop: true
2067 pop: true
2324 - include: expression-inside-possibly-arrow-parens
2068 - include: expression-inside-possibly-arrow-parens
2325 possibly-arrow-return-type:
2069 possibly-arrow-return-type:
2326− - match: '(?<=\)|^)\s*(:)(?=\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*=>)'
2070+ - match: '(?<=\))\s*(:)(?=\s*([^<>\(\)]|\<[^<>]+\>|\([^\(\)]+\))+\s*=>)'
2327 captures:
2071 captures:
2328 1: meta.arrow.tsx meta.return.type.arrow.tsx keyword.operator.type.annotation.tsx
2072 1: meta.arrow.tsx meta.return.type.arrow.tsx keyword.operator.type.annotation.tsx
2329 push:
2073 push:
@@ -2370,23 +2114,23 @@ contexts:
2370 pop: true
2114 pop: true
2371 - include: string-character-escape
2115 - include: string-character-escape
2372 regex:
2116 regex:
2373− - match: '(?<!\+\+|--|})(?<=[=(:,\[?+!]|^return|[^\._$[:alnum:]]return|^case|[^\._$[:alnum:]]case|=>|&&|\|\||\*\/)\s*(\/)(?![\/*])(?=(?:[^\/\\\[\()]|\\.|\[([^\]\\]|\\.)+\]|\(([^\)\\]|\\.)+\))+\/([dgimsuy]+|(?![\/\*])|(?=\/\*))(?!\s*[a-zA-Z0-9_$]))'
2117+ - match: '(?<!\+\+|--|})(?<=[=(:,\[?+!]|^return|[^\._$[:alnum:]]return|^case|[^\._$[:alnum:]]case|=>|&&|\|\||\*\/)\s*(\/)(?![\/*])(?=(?:[^\/\\\[]|\\.|\[([^\]\\]|\\.)+\])+\/[gimsuy]*(?!\s*[a-zA-Z0-9_$]))'
2374 captures:
2118 captures:
2375 1: punctuation.definition.string.begin.tsx
2119 1: punctuation.definition.string.begin.tsx
2376 push:
2120 push:
2377 - meta_scope: string.regexp.tsx
2121 - meta_scope: string.regexp.tsx
2378− - match: "(/)([dgimsuy]*)"
2122+ - match: "(/)([gimsuy]*)"
2379 captures:
2123 captures:
2380 1: punctuation.definition.string.end.tsx
2124 1: punctuation.definition.string.end.tsx
2381 2: keyword.other.tsx
2125 2: keyword.other.tsx
2382 pop: true
2126 pop: true
2383 - include: regexp
2127 - include: regexp
2384− - match: '((?<![_$[:alnum:])\]]|\+\+|--|}|\*\/)|((?<=^return|[^\._$[:alnum:]]return|^case|[^\._$[:alnum:]]case))\s*)\/(?![\/*])(?=(?:[^\/\\\[]|\\.|\[([^\]\\]|\\.)*\])+\/([dgimsuy]+|(?![\/\*])|(?=\/\*))(?!\s*[a-zA-Z0-9_$]))'
2128+ - match: '(?<![_$[:alnum:])\]]|\+\+|--|})\/(?![\/*])(?=(?:[^\/\\\[]|\\.|\[([^\]\\]|\\.)+\])+\/[gimsuy]*(?!\s*[a-zA-Z0-9_$]))'
2385 captures:
2129 captures:
2386 0: punctuation.definition.string.begin.tsx
2130 0: punctuation.definition.string.begin.tsx
2387 push:
2131 push:
2388 - meta_scope: string.regexp.tsx
2132 - meta_scope: string.regexp.tsx
2389− - match: "(/)([dgimsuy]*)"
2133+ - match: "(/)([gimsuy]*)"
2390 captures:
2134 captures:
2391 1: punctuation.definition.string.end.tsx
2135 1: punctuation.definition.string.end.tsx
2392 2: keyword.other.tsx
2136 2: keyword.other.tsx
@@ -2486,24 +2230,10 @@ contexts:
2486 - include: type-object
2230 - include: type-object
2487 - include: type-predicate-operator
2231 - include: type-predicate-operator
2488 - include: type
2232 - include: type
2489− shebang:
2490− - match: \A(#!).*(?=$)
2491− scope: comment.line.shebang.tsx
2492− captures:
2493− 1: punctuation.definition.comment.tsx
2494− single-line-comment-consuming-line-ending:
2495− - match: '(^[ \t]+)?((//)(?:\s*((@)internal)(?=\s|$))?)'
2496− captures:
2497− 1: punctuation.whitespace.comment.leading.tsx
2498− 2: comment.line.double-slash.tsx
2499− 3: punctuation.definition.comment.tsx
2500− 4: storage.type.internaldeclaration.tsx
2501− 5: punctuation.decorator.internaldeclaration.tsx
2502− push:
2503− - meta_content_scope: comment.line.double-slash.tsx
2504− - match: (?=^)
2505− pop: true
2506 statements:
2233 statements:
2234+ - include: string
2235+ - include: template
2236+ - include: comment
2507 - include: declaration
2237 - include: declaration
2508 - include: control-statement
2238 - include: control-statement
2509 - include: after-operator-block-as-object-literal
2239 - include: after-operator-block-as-object-literal
@@ -2511,31 +2241,21 @@ contexts:
2511 - include: label
2241 - include: label
2512 - include: expression
2242 - include: expression
2513 - include: punctuation-semicolon
2243 - include: punctuation-semicolon
2514− - include: string
2515− - include: comment
2516 string:
2244 string:
2517 - include: qstring-single
2245 - include: qstring-single
2518 - include: qstring-double
2246 - include: qstring-double
2519− - include: template
2520 string-character-escape:
2247 string-character-escape:
2521− - match: '\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4}|u\{[0-9A-Fa-f]+\}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.|$)'
2248+ - match: '\\(x[0-9A-Fa-f]{2}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.|$)'
2522 scope: constant.character.escape.tsx
2249 scope: constant.character.escape.tsx
2523 super-literal:
2250 super-literal:
2524 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))super\b(?!\$)'
2251 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))super\b(?!\$)'
2525 scope: variable.language.super.tsx
2252 scope: variable.language.super.tsx
2526− support-function-call-identifiers:
2527− - include: literal
2528− - include: support-objects
2529− - include: object-identifiers
2530− - include: punctuation-accessor
2531− - match: '(?:(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))import(?=\s*[\(]\s*[\"\''\`]))'
2532− scope: keyword.operator.expression.import.tsx
2533 support-objects:
2253 support-objects:
2534 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(arguments)\b(?!\$)'
2254 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(arguments)\b(?!\$)'
2535 scope: variable.language.arguments.tsx
2255 scope: variable.language.arguments.tsx
2536 - match: |-
2256 - match: |-
2537− (?x)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(Array|ArrayBuffer|Atomics|BigInt|BigInt64Array|BigUint64Array|Boolean|DataView|Date|Float32Array
2257+ (?x)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(Array|ArrayBuffer|Atomics|Boolean|DataView|Date|Float32Array|Float64Array|Function|Generator
2538− |Float64Array|Function|Generator|GeneratorFunction|Int8Array|Int16Array|Int32Array|Intl|Map|Number|Object|Proxy
2258+ |GeneratorFunction|Int8Array|Int16Array|Int32Array|Intl|Map|Number|Object|Proxy
2539 |Reflect|RegExp|Set|SharedArrayBuffer|SIMD|String|Symbol|TypedArray
2259 |Reflect|RegExp|Set|SharedArrayBuffer|SIMD|String|Symbol|TypedArray
2540 |Uint8Array|Uint16Array|Uint32Array|Uint8ClampedArray|WeakMap|WeakSet)\b(?!\$)
2260 |Uint8Array|Uint16Array|Uint32Array|Uint8ClampedArray|WeakMap|WeakSet)\b(?!\$)
2541 scope: support.class.builtin.tsx
2261 scope: support.class.builtin.tsx
@@ -2589,9 +2309,9 @@ contexts:
2589 4: support.variable.property.target.tsx
2309 4: support.variable.property.target.tsx
2590 - match: |-
2310 - match: |-
2591 (?x) (?:(\.)|(\?\.(?!\s*[[:digit:]]))) \s* (?:
2311 (?x) (?:(\.)|(\?\.(?!\s*[[:digit:]]))) \s* (?:
2592− (?:(constructor|length|prototype|__proto__)\b(?!\$|\s*(<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?\())
2312+ (constructor|length|prototype|__proto__)
2593 |
2313 |
2594− (?:(EPSILON|MAX_SAFE_INTEGER|MAX_VALUE|MIN_SAFE_INTEGER|MIN_VALUE|NEGATIVE_INFINITY|POSITIVE_INFINITY)\b(?!\$)))
2314+ (EPSILON|MAX_SAFE_INTEGER|MAX_VALUE|MIN_SAFE_INTEGER|MIN_VALUE|NEGATIVE_INFINITY|POSITIVE_INFINITY))\b(?!\$)
2595 captures:
2315 captures:
2596 1: punctuation.accessor.tsx
2316 1: punctuation.accessor.tsx
2597 2: punctuation.accessor.optional.tsx
2317 2: punctuation.accessor.optional.tsx
@@ -2695,7 +2415,7 @@ contexts:
2695 |siblingBelow|size|source|specified|standby|start|status|statusbar|statusText|style|styleSheets|suffixes|summary
2415 |siblingBelow|size|source|specified|standby|start|status|statusbar|statusText|style|styleSheets|suffixes|summary
2696 |systemId|systemLanguage|tagName|tags|target|tBodies|text|textAlign|textDecoration|textIndent|textTransform|tFoot|tHead
2416 |systemId|systemLanguage|tagName|tags|target|tBodies|text|textAlign|textDecoration|textIndent|textTransform|tFoot|tHead
2697 |title|toolbar|top|type|undefined|uniqueID|updateInterval|URL|URLUnencoded|useMap|userAgent|userLanguage|userProfile
2417 |title|toolbar|top|type|undefined|uniqueID|updateInterval|URL|URLUnencoded|useMap|userAgent|userLanguage|userProfile
2698− |vAlign|value|valueType|vendor|vendorSub|version|visibility|vspace|whiteSpace|width|X[MS]LDocument|zIndex))\b(?!\$|\s*(<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?\()
2418+ |vAlign|value|valueType|vendor|vendorSub|version|visibility|vspace|whiteSpace|width|X[MS]LDocument|zIndex))\b(?!\$|\s*(<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*>\s*)?\()
2699 captures:
2419 captures:
2700 1: punctuation.accessor.tsx
2420 1: punctuation.accessor.tsx
2701 2: punctuation.accessor.optional.tsx
2421 2: punctuation.accessor.optional.tsx
@@ -2819,7 +2539,6 @@ contexts:
2819 captures:
2539 captures:
2820 0: punctuation.definition.block.tsx
2540 0: punctuation.definition.block.tsx
2821 pop: true
2541 pop: true
2822− - include: comment
2823 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(switch)\s*(\()'
2542 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(switch)\s*(\()'
2824 captures:
2543 captures:
2825 1: keyword.control.switch.tsx
2544 1: keyword.control.switch.tsx
@@ -2862,34 +2581,7 @@ contexts:
2862 0: case-clause.expr.tsx punctuation.definition.section.case-statement.tsx
2581 0: case-clause.expr.tsx punctuation.definition.section.case-statement.tsx
2863 - include: statements
2582 - include: statements
2864 template:
2583 template:
2865− - include: template-call
2584+ - match: '([_$[:alpha:]][_$[:alnum:]]*)\s*(?=(<\s*(((keyof|infer)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\''[^\'']*\'')|(\"[^\"]*\")|(\`[^\`]*\`))(?=\s*([\<\>\,\.\[=]|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?<==)\>|\<\s*(((keyof|infer)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\''[^\'']*\'')|(\"[^\"]*\")|(\`[^\`]*\`))(?=\s*([\<\>\,\.\[=]|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?<==)\>)*(?!=)\>)*(?!=)>\s*)`)'
2866− - match: "([_$[:alpha:]][_$[:alnum:]]*)?(`)"
2867− captures:
2868− 1: entity.name.function.tagged-template.tsx
2869− 2: punctuation.definition.string.template.begin.tsx
2870− push:
2871− - meta_scope: string.template.tsx
2872− - match: "`"
2873− captures:
2874− 0: punctuation.definition.string.template.end.tsx
2875− pop: true
2876− - include: template-substitution-element
2877− - include: string-character-escape
2878− template-call:
2879− - match: '(?=(([_$[:alpha:]][_$[:alnum:]]*\s*\??\.\s*)*|(\??\.\s*)?)([_$[:alpha:]][_$[:alnum:]]*)(<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))(([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>)*(?<!=)\>))*(?<!=)\>)*(?<!=)>\s*)?`)'
2880− push:
2881− - meta_scope: string.template.tsx
2882− - match: (?=`)
2883− pop: true
2884− - match: '(?=(([_$[:alpha:]][_$[:alnum:]]*\s*\??\.\s*)*|(\??\.\s*)?)([_$[:alpha:]][_$[:alnum:]]*))'
2885− push:
2886− - match: '(?=(<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))(([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>)*(?<!=)\>))*(?<!=)\>)*(?<!=)>\s*)?`)'
2887− pop: true
2888− - include: support-function-call-identifiers
2889− - match: "([_$[:alpha:]][_$[:alnum:]]*)"
2890− scope: entity.name.function.tagged-template.tsx
2891− - include: type-arguments
2892− - match: '([_$[:alpha:]][_$[:alnum:]]*)?\s*(?=(<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))(([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>|\<\s*(((keyof|infer|typeof|readonly)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\''([^\''\\]|\\.)*\'')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(?<==)\>)*(?<!=)\>))*(?<!=)\>)*(?<!=)>\s*)`)'
2893 captures:
2585 captures:
2894 1: entity.name.function.tagged-template.tsx
2586 1: entity.name.function.tagged-template.tsx
2895 push:
2587 push:
@@ -2897,20 +2589,6 @@ contexts:
2897 - match: (?=`)
2589 - match: (?=`)
2898 pop: true
2590 pop: true
2899 - include: type-arguments
2591 - include: type-arguments
2900− template-substitution-element:
2901− - match: '\$\{'
2902− captures:
2903− 0: punctuation.definition.template-expression.begin.tsx
2904− push:
2905− - meta_scope: meta.template.expression.tsx
2906− - meta_content_scope: meta.embedded.line.tsx
2907− - match: '\}'
2908− captures:
2909− 0: punctuation.definition.template-expression.end.tsx
2910− pop: true
2911− - include: expression
2912− template-type:
2913− - include: template-call
2914 - match: "([_$[:alpha:]][_$[:alnum:]]*)?(`)"
2592 - match: "([_$[:alpha:]][_$[:alnum:]]*)?(`)"
2915 captures:
2593 captures:
2916 1: entity.name.function.tagged-template.tsx
2594 1: entity.name.function.tagged-template.tsx
@@ -2921,9 +2599,9 @@ contexts:
2921 captures:
2599 captures:
2922 0: punctuation.definition.string.template.end.tsx
2600 0: punctuation.definition.string.template.end.tsx
2923 pop: true
2601 pop: true
2924− - include: template-type-substitution-element
2602+ - include: template-substitution-element
2925 - include: string-character-escape
2603 - include: string-character-escape
2926− template-type-substitution-element:
2604+ template-substitution-element:
2927 - match: '\$\{'
2605 - match: '\$\{'
2928 captures:
2606 captures:
2929 0: punctuation.definition.template-expression.begin.tsx
2607 0: punctuation.definition.template-expression.begin.tsx
@@ -2934,9 +2612,9 @@ contexts:
2934 captures:
2612 captures:
2935 0: punctuation.definition.template-expression.end.tsx
2613 0: punctuation.definition.template-expression.end.tsx
2936 pop: true
2614 pop: true
2937− - include: type
2615+ - include: expression
2938 ternary-expression:
2616 ternary-expression:
2939− - match: '(?!\?\.\s*[^[:digit:]])(\?)(?!\?)'
2617+ - match: '(?!\?\.\s*[^[:digit:]])(\?)'
2940 captures:
2618 captures:
2941 1: keyword.operator.ternary.tsx
2619 1: keyword.operator.ternary.tsx
2942 push:
2620 push:
@@ -2950,7 +2628,7 @@ contexts:
2950 scope: variable.language.this.tsx
2628 scope: variable.language.this.tsx
2951 type:
2629 type:
2952 - include: comment
2630 - include: comment
2953− - include: type-string
2631+ - include: string
2954 - include: numeric-literal
2632 - include: numeric-literal
2955 - include: type-primitive
2633 - include: type-primitive
2956 - include: type-builtin-literals
2634 - include: type-builtin-literals
@@ -2962,36 +2640,24 @@ contexts:
2962 - include: type-fn-type-parameters
2640 - include: type-fn-type-parameters
2963 - include: type-paren-or-function-parameters
2641 - include: type-paren-or-function-parameters
2964 - include: type-function-return-type
2642 - include: type-function-return-type
2965− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(readonly)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))\s*'
2966− captures:
2967− 1: storage.modifier.tsx
2968 - include: type-name
2643 - include: type-name
2969 type-alias-declaration:
2644 type-alias-declaration:
2970− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(type)\b\s+([_$[:alpha:]][_$[:alnum:]]*)\s*'
2645+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?\b(type)\b\s+([_$[:alpha:]][_$[:alnum:]]*)\s*'
2971 captures:
2646 captures:
2972 1: keyword.control.export.tsx
2647 1: keyword.control.export.tsx
2973− 2: storage.modifier.tsx
2648+ 2: storage.type.type.tsx
2974− 3: storage.type.type.tsx
2649+ 3: entity.name.type.alias.tsx
2975− 4: entity.name.type.alias.tsx
2976 push:
2650 push:
2977 - meta_scope: meta.type.declaration.tsx
2651 - meta_scope: meta.type.declaration.tsx
2978− - match: '(?=\}|;|^\s*$|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))'
2652+ - match: '(?=\}|;|^\s*abstract\b|^\s*async\b|^\s*class\b|^\s*const\b|^\s*declare\b|^\s*enum\b|^\s*export\b|^\s*function\b|^\s*import\b|^\s*interface\b|^\s*let\b|^\s*module\b|^\s*namespace\b|^\s*return\b|^\s*type\b|^\s*var\b)'
2979 pop: true
2653 pop: true
2980 - include: comment
2654 - include: comment
2981 - include: type-parameters
2655 - include: type-parameters
2982− - match: '(=)\s*(intrinsic)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
2983− captures:
2984− 1: keyword.operator.assignment.tsx
2985− 2: keyword.control.intrinsic.tsx
2986− push:
2987− - match: '(?=\}|;|^\s*$|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))'
2988− pop: true
2989− - include: type
2990 - match: (=)\s*
2656 - match: (=)\s*
2991 captures:
2657 captures:
2992 1: keyword.operator.assignment.tsx
2658 1: keyword.operator.assignment.tsx
2993 push:
2659 push:
2994− - match: '(?=\}|;|^\s*$|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))'
2660+ - match: '(?=\}|;|^\s*abstract\b|^\s*async\b|^\s*class\b|^\s*const\b|^\s*declare\b|^\s*enum\b|^\s*export\b|^\s*function\b|^\s*import\b|^\s*interface\b|^\s*let\b|^\s*module\b|^\s*namespace\b|^\s*return\b|^\s*type\b|^\s*var\b)'
2995 pop: true
2661 pop: true
2996 - include: type
2662 - include: type
2997 type-annotation:
2663 type-annotation:
@@ -3021,13 +2687,8 @@ contexts:
3021 captures:
2687 captures:
3022 0: punctuation.definition.typeparameters.end.tsx
2688 0: punctuation.definition.typeparameters.end.tsx
3023 pop: true
2689 pop: true
3024− - include: type-arguments-body
2690+ - include: type
3025− type-arguments-body:
2691+ - include: punctuation-comma
3026− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(_)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
3027− captures:
3028− 0: keyword.operator.type.tsx
3029− - include: type
3030− - include: punctuation-comma
3031 type-builtin-literals:
2692 type-builtin-literals:
3032 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(this|true|false|undefined|null|object)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
2693 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(this|true|false|undefined|null|object)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
3033 scope: support.type.builtin.tsx
2694 scope: support.type.builtin.tsx
@@ -3049,19 +2710,13 @@ contexts:
3049 - include: type
2710 - include: type
3050 - include: type
2711 - include: type
3051 type-fn-type-parameters:
2712 type-fn-type-parameters:
3052− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(abstract)\s+)?(new)\b(?=\s*\<)'
2713+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(new)\b(?=\s*\<)'
2714+ scope: meta.type.constructor.tsx
3053 captures:
2715 captures:
3054− 1: meta.type.constructor.tsx storage.modifier.tsx
2716+ 1: keyword.control.new.tsx
3055− 2: meta.type.constructor.tsx keyword.control.new.tsx
2717+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(new)\b\s*(?=\()'
3056− push:
3057− - match: (?<=>)
3058− pop: true
3059− - include: comment
3060− - include: type-parameters
3061− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(abstract)\s+)?(new)\b\s*(?=\()'
3062 captures:
2718 captures:
3063− 1: storage.modifier.tsx
2719+ 1: keyword.control.new.tsx
3064− 2: keyword.control.new.tsx
3065 push:
2720 push:
3066 - meta_scope: meta.type.constructor.tsx
2721 - meta_scope: meta.type.constructor.tsx
3067 - match: (?<=\))
2722 - match: (?<=\))
@@ -3112,30 +2767,6 @@ contexts:
3112 - include: type-predicate-operator
2767 - include: type-predicate-operator
3113 - include: type
2768 - include: type
3114 type-name:
2769 type-name:
3115− - match: '([_$[:alpha:]][_$[:alnum:]]*)\s*(?:(\.)|(\?\.(?!\s*[[:digit:]])))\s*(<)'
3116− captures:
3117− 1: entity.name.type.module.tsx
3118− 2: punctuation.accessor.tsx
3119− 3: punctuation.accessor.optional.tsx
3120− 4: meta.type.parameters.tsx punctuation.definition.typeparameters.begin.tsx
3121− push:
3122− - meta_content_scope: meta.type.parameters.tsx
3123− - match: (>)
3124− captures:
3125− 1: meta.type.parameters.tsx punctuation.definition.typeparameters.end.tsx
3126− pop: true
3127− - include: type-arguments-body
3128− - match: '([_$[:alpha:]][_$[:alnum:]]*)\s*(<)'
3129− captures:
3130− 1: entity.name.type.tsx
3131− 2: meta.type.parameters.tsx punctuation.definition.typeparameters.begin.tsx
3132− push:
3133− - meta_content_scope: meta.type.parameters.tsx
3134− - match: (>)
3135− captures:
3136− 1: meta.type.parameters.tsx punctuation.definition.typeparameters.end.tsx
3137− pop: true
3138− - include: type-arguments-body
3139 - match: '([_$[:alpha:]][_$[:alnum:]]*)\s*(?:(\.)|(\?\.(?!\s*[[:digit:]])))'
2770 - match: '([_$[:alpha:]][_$[:alnum:]]*)\s*(?:(\.)|(\?\.(?!\s*[[:digit:]])))'
3140 captures:
2771 captures:
3141 1: entity.name.type.module.tsx
2772 1: entity.name.type.module.tsx
@@ -3171,16 +2802,18 @@ contexts:
3171 - include: type
2802 - include: type
3172 type-operators:
2803 type-operators:
3173 - include: typeof-operator
2804 - include: typeof-operator
3174− - match: '([&|])(?=\s*\{)'
2805+ - match: '(?:([&|])|(=(?!>)))(?=\s*\{)'
3175 captures:
2806 captures:
3176− 0: keyword.operator.type.tsx
2807+ 1: keyword.operator.type.tsx
2808+ 2: keyword.operator.assignment.tsx
3177 push:
2809 push:
3178 - match: '(?<=\})'
2810 - match: '(?<=\})'
3179 pop: true
2811 pop: true
3180 - include: type-object
2812 - include: type-object
3181− - match: "[&|]"
2813+ - match: "([&|])|(=(?!>))"
3182 captures:
2814 captures:
3183− 0: keyword.operator.type.tsx
2815+ 1: keyword.operator.type.tsx
2816+ 2: keyword.operator.assignment.tsx
3184 push:
2817 push:
3185 - match: (?=\S)
2818 - match: (?=\S)
3186 pop: true
2819 pop: true
@@ -3207,8 +2840,6 @@ contexts:
3207 scope: storage.modifier.tsx
2840 scope: storage.modifier.tsx
3208 - include: type
2841 - include: type
3209 - include: punctuation-comma
2842 - include: punctuation-comma
3210− - match: (=)(?!>)
3211− scope: keyword.operator.assignment.tsx
3212 type-paren-or-function-parameters:
2843 type-paren-or-function-parameters:
3213 - match: \(
2844 - match: \(
3214 captures:
2845 captures:
@@ -3219,6 +2850,7 @@ contexts:
3219 captures:
2850 captures:
3220 0: meta.brace.round.tsx
2851 0: meta.brace.round.tsx
3221 pop: true
2852 pop: true
2853+ - include: destructuring-parameter
3222 - match: |-
2854 - match: |-
3223 (?x)(?:(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(public|private|protected|readonly)\s+)?(?:(\.\.\.)\s*)?(?<!=|:)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(this)|([_$[:alpha:]][_$[:alnum:]]*))\s*(\??)(?=\s*(:\s*(
2855 (?x)(?:(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(public|private|protected|readonly)\s+)?(?:(\.\.\.)\s*)?(?<!=|:)(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(this)|([_$[:alpha:]][_$[:alnum:]]*))\s*(\??)(?=\s*(:\s*(
3224 (<) |
2856 (<) |
@@ -3231,8 +2863,7 @@ contexts:
3231 ))
2863 ))
3232 ))
2864 ))
3233 )) |
2865 )) |
3234− (:\s*(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))Function(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))) |
2866+ (:\s*((<\s*$)|([\(]\s*([\{\[]\s*)?$))))
3235− (:\s*((<\s*$)|([\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*))))))))
3236 captures:
2867 captures:
3237 1: storage.modifier.tsx
2868 1: storage.modifier.tsx
3238 2: keyword.operator.rest.tsx
2869 2: keyword.operator.rest.tsx
@@ -3251,28 +2882,11 @@ contexts:
3251 scope: punctuation.separator.parameter.tsx
2882 scope: punctuation.separator.parameter.tsx
3252 - include: type
2883 - include: type
3253 type-predicate-operator:
2884 type-predicate-operator:
3254− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(asserts)\s+)?(?!asserts)(?:(this)|([_$[:alpha:]][_$[:alnum:]]*))\s(is)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
3255− captures:
3256− 1: keyword.operator.type.asserts.tsx
3257− 2: variable.parameter.tsx variable.language.this.tsx
3258− 3: variable.parameter.tsx
3259− 4: keyword.operator.expression.is.tsx
3260− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(asserts)\s+(?!is)(?:(this)|([_$[:alpha:]][_$[:alnum:]]*))(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
3261− captures:
3262− 1: keyword.operator.type.asserts.tsx
3263− 2: variable.parameter.tsx variable.language.this.tsx
3264− 3: variable.parameter.tsx
3265− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))asserts(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
3266− scope: keyword.operator.type.asserts.tsx
3267 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))is(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
2885 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))is(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
3268 scope: keyword.operator.expression.is.tsx
2886 scope: keyword.operator.expression.is.tsx
3269 type-primitive:
2887 type-primitive:
3270− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(string|number|bigint|boolean|symbol|any|void|never|unknown)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
2888+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(string|number|boolean|symbol|any|void|never)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
3271 scope: support.type.primitive.tsx
2889 scope: support.type.primitive.tsx
3272− type-string:
3273− - include: qstring-single
3274− - include: qstring-double
3275− - include: template-type
3276 type-tuple:
2890 type-tuple:
3277 - match: '\['
2891 - match: '\['
3278 captures:
2892 captures:
@@ -3283,84 +2897,56 @@ contexts:
3283 captures:
2897 captures:
3284 0: meta.brace.square.tsx
2898 0: meta.brace.square.tsx
3285 pop: true
2899 pop: true
3286− - match: \.\.\.
3287− scope: keyword.operator.rest.tsx
3288− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))([_$[:alpha:]][_$[:alnum:]]*)\s*(\?)?\s*(:)'
3289− captures:
3290− 1: entity.name.label.tsx
3291− 2: keyword.operator.optional.tsx
3292− 3: punctuation.separator.label.tsx
3293 - include: type
2900 - include: type
3294 - include: punctuation-comma
2901 - include: punctuation-comma
3295 typeof-operator:
2902 typeof-operator:
3296 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))typeof(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
2903 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))typeof(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
3297− captures:
2904+ scope: keyword.operator.expression.typeof.tsx
3298− 0: keyword.operator.expression.typeof.tsx
3299− push:
3300− - match: '(?=[,);}\]=>:&|{\?]|$|;|^\s*$|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))'
3301− pop: true
3302− - include: expression
3303 undefined-literal:
2905 undefined-literal:
3304 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))undefined(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
2906 - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))undefined(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
3305 scope: constant.language.undefined.tsx
2907 scope: constant.language.undefined.tsx
3306 var-expr:
2908 var-expr:
3307− - match: '(?=(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(var|let)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.)))'
2909+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?\b(var|let)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
2910+ captures:
2911+ 1: keyword.control.export.tsx
2912+ 2: storage.type.tsx
3308 push:
2913 push:
3309 - meta_scope: meta.var.expr.tsx
2914 - meta_scope: meta.var.expr.tsx
3310− - match: '(?!(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(var|let)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.)))((?=;|}|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(of|in)\s+)|;|^\s*$|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))|((?<!^let|[^\._$[:alnum:]]let|^var|[^\._$[:alnum:]]var)(?=\s*$)))'
2915+ - match: '((?=;|}|(\s+(of|in)\s+)|^\s*$|;|^\s*abstract\b|^\s*async\b|^\s*class\b|^\s*const\b|^\s*declare\b|^\s*enum\b|^\s*export\b|^\s*function\b|^\s*import\b|^\s*interface\b|^\s*let\b|^\s*module\b|^\s*namespace\b|^\s*return\b|^\s*type\b|^\s*var\b)|((?<=\S)(?<!^let|[^\._$[:alnum:]]let|^var|[^\._$[:alnum:]]var)(?=\s*$)))'
3311 pop: true
2916 pop: true
3312− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(var|let)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))\s*'
3313− captures:
3314− 1: keyword.control.export.tsx
3315− 2: storage.modifier.tsx
3316− 3: storage.type.tsx
3317− push:
3318− - match: (?=\S)
3319− pop: true
3320 - include: destructuring-variable
2917 - include: destructuring-variable
3321 - include: var-single-variable
2918 - include: var-single-variable
3322 - include: variable-initializer
2919 - include: variable-initializer
3323 - include: comment
2920 - include: comment
3324− - match: (,)\s*((?!\S)|(?=\/\/))
2921+ - match: (,)\s*(?!\S)
3325 captures:
2922 captures:
3326 1: punctuation.separator.comma.tsx
2923 1: punctuation.separator.comma.tsx
3327 push:
2924 push:
3328− - match: '(?<!,)(((?==|;|}|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(of|in)\s+)|^\s*$))|((?<=\S)(?=\s*$)))'
2925+ - match: '(?<!,)(((?==|;|}|(\s+(of|in)\s+)|^\s*$))|((?<=\S)(?=\s*$)))'
3329 pop: true
2926 pop: true
3330− - include: single-line-comment-consuming-line-ending
3331 - include: comment
2927 - include: comment
3332 - include: destructuring-variable
2928 - include: destructuring-variable
3333 - include: var-single-variable
2929 - include: var-single-variable
3334 - include: punctuation-comma
2930 - include: punctuation-comma
3335 - include: punctuation-comma
2931 - include: punctuation-comma
3336− - match: '(?=(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(const(?!\s+enum\b))(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.)))'
2932+ - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?\b(const(?!\s+enum\b))(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))'
3337 captures:
2933 captures:
3338 1: keyword.control.export.tsx
2934 1: keyword.control.export.tsx
3339− 2: storage.modifier.tsx
2935+ 2: storage.type.tsx
3340− 3: storage.type.tsx
3341 push:
2936 push:
3342 - meta_scope: meta.var.expr.tsx
2937 - meta_scope: meta.var.expr.tsx
3343− - match: '(?!(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(const(?!\s+enum\b))(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.)))((?=;|}|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(of|in)\s+)|;|^\s*$|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))|((?<!^const|[^\._$[:alnum:]]const)(?=\s*$)))'
2938+ - match: '((?=;|}|(\s+(of|in)\s+)|^\s*$|;|^\s*abstract\b|^\s*async\b|^\s*class\b|^\s*const\b|^\s*declare\b|^\s*enum\b|^\s*export\b|^\s*function\b|^\s*import\b|^\s*interface\b|^\s*let\b|^\s*module\b|^\s*namespace\b|^\s*return\b|^\s*type\b|^\s*var\b)|((?<=\S)(?<!^const|[^\._$[:alnum:]]const)(?=\s*$)))'
3344 pop: true
2939 pop: true
3345− - match: '(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(const(?!\s+enum\b))(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))\s*'
3346− captures:
3347− 1: keyword.control.export.tsx
3348− 2: storage.modifier.tsx
3349− 3: storage.type.tsx
3350− push:
3351− - match: (?=\S)
3352− pop: true
3353 - include: destructuring-const
2940 - include: destructuring-const
3354 - include: var-single-const
2941 - include: var-single-const
3355 - include: variable-initializer
2942 - include: variable-initializer
3356 - include: comment
2943 - include: comment
3357− - match: (,)\s*((?!\S)|(?=\/\/))
2944+ - match: (,)\s*(?!\S)
3358 captures:
2945 captures:
3359 1: punctuation.separator.comma.tsx
2946 1: punctuation.separator.comma.tsx
3360 push:
2947 push:
3361− - match: '(?<!,)(((?==|;|}|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(of|in)\s+)|^\s*$))|((?<=\S)(?=\s*$)))'
2948+ - match: '(?<!,)(((?==|;|}|(\s+(of|in)\s+)|^\s*$))|((?<=\S)(?=\s*$)))'
3362 pop: true
2949 pop: true
3363− - include: single-line-comment-consuming-line-ending
3364 - include: comment
2950 - include: comment
3365 - include: destructuring-const
2951 - include: destructuring-const
3366 - include: var-single-const
2952 - include: var-single-const
@@ -3377,11 +2963,11 @@ contexts:
3377 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
2963 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
3378 )) |
2964 )) |
3379 ((async\s*)?(
2965 ((async\s*)?(
3380− ((<\s*$)|([\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
2966+ ((<\s*$)|([\(]\s*([\{\[]\s*)?$)) |
3381 # sure shot arrow functions even if => is on new line
2967 # sure shot arrow functions even if => is on new line
3382 (
2968 (
3383− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
2969+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*>\s*)?
3384− [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
2970+ [(]\s*
3385 (
2971 (
3386 ([)]\s*:) | # ():
2972 ([)]\s*:) | # ():
3387 ((\.\.\.\s*)?[_$[:alpha:]][_$[:alnum:]]*\s*:) # [(]param: | [(]...param:
2973 ((\.\.\.\s*)?[_$[:alpha:]][_$[:alnum:]]*\s*:) # [(]param: | [(]...param:
@@ -3392,9 +2978,9 @@ contexts:
3392 ) |
2978 ) |
3393 # arrow function possible to detect only with => on same line
2979 # arrow function possible to detect only with => on same line
3394 (
2980 (
3395− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
2981+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*>\s*)? # typeparameters
3396− \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
2982+ \(\s*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()]|(\(([^\(\)]|(\([^\(\)]*\)))*\)))*)?\) # parameters
3397− (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
2983+ (\s*:\s*([^<>\(\)]|\<[^<>]+\>|\([^\(\)]+\))+)? # return type
3398 \s*=> # arrow operator
2984 \s*=> # arrow operator
3399 )
2985 )
3400 ))
2986 ))
@@ -3411,20 +2997,19 @@ contexts:
3411 ))
2997 ))
3412 ))
2998 ))
3413 )) |
2999 )) |
3414− (:\s*(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))Function(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))) |
3000+ (:\s*((<\s*$)|([\(]\s*([\{\[]\s*)?$))) |
3415− (:\s*((<\s*$)|([\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*))))))) |
3001+ (:\s*(=>|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(<[^<>]*>)|[^<>(),=])+=\s*(
3416− (:\s*(=>|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(<[^<>]*>)|[^<>(),=])+=\s*(
3417 ((async\s+)?(
3002 ((async\s+)?(
3418 (function\s*[(<*]) |
3003 (function\s*[(<*]) |
3419 (function\s+) |
3004 (function\s+) |
3420 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
3005 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
3421 )) |
3006 )) |
3422 ((async\s*)?(
3007 ((async\s*)?(
3423− ((<\s*$)|([\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
3008+ ((<\s*$)|([\(]\s*([\{\[]\s*)?$)) |
3424 # sure shot arrow functions even if => is on new line
3009 # sure shot arrow functions even if => is on new line
3425 (
3010 (
3426− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
3011+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*>\s*)?
3427− [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
3012+ [(]\s*
3428 (
3013 (
3429 ([)]\s*:) | # ():
3014 ([)]\s*:) | # ():
3430 ((\.\.\.\s*)?[_$[:alpha:]][_$[:alnum:]]*\s*:) # [(]param: | [(]...param:
3015 ((\.\.\.\s*)?[_$[:alpha:]][_$[:alnum:]]*\s*:) # [(]param: | [(]...param:
@@ -3435,9 +3020,9 @@ contexts:
3435 ) |
3020 ) |
3436 # arrow function possible to detect only with => on same line
3021 # arrow function possible to detect only with => on same line
3437 (
3022 (
3438− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
3023+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*>\s*)? # typeparameters
3439− \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
3024+ \(\s*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()]|(\(([^\(\)]|(\([^\(\)]*\)))*\)))*)?\) # parameters
3440− (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
3025+ (\s*:\s*([^<>\(\)]|\<[^<>]+\>|\([^\(\)]+\))+)? # return type
3441 \s*=> # arrow operator
3026 \s*=> # arrow operator
3442 )
3027 )
3443 ))
3028 ))
@@ -3446,7 +3031,7 @@ contexts:
3446 1: meta.definition.variable.tsx variable.other.constant.tsx entity.name.function.tsx
3031 1: meta.definition.variable.tsx variable.other.constant.tsx entity.name.function.tsx
3447 push:
3032 push:
3448 - meta_scope: meta.var-single-variable.expr.tsx
3033 - meta_scope: meta.var-single-variable.expr.tsx
3449− - match: '(?=$|^|[;,=}]|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(of|in)\s+))'
3034+ - match: '(?=$|^|[;,=}]|(\s+(of|in)\s+))'
3450 pop: true
3035 pop: true
3451 - include: var-single-variable-type-annotation
3036 - include: var-single-variable-type-annotation
3452 - match: "([_$[:alpha:]][_$[:alnum:]]*)"
3037 - match: "([_$[:alpha:]][_$[:alnum:]]*)"
@@ -3454,12 +3039,12 @@ contexts:
3454 1: meta.definition.variable.tsx variable.other.constant.tsx
3039 1: meta.definition.variable.tsx variable.other.constant.tsx
3455 push:
3040 push:
3456 - meta_scope: meta.var-single-variable.expr.tsx
3041 - meta_scope: meta.var-single-variable.expr.tsx
3457− - match: '(?=$|^|[;,=}]|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(of|in)\s+))'
3042+ - match: '(?=$|^|[;,=}]|(\s+(of|in)\s+))'
3458 pop: true
3043 pop: true
3459 - include: var-single-variable-type-annotation
3044 - include: var-single-variable-type-annotation
3460 var-single-variable:
3045 var-single-variable:
3461 - match: |-
3046 - match: |-
3462− (?x)([_$[:alpha:]][_$[:alnum:]]*)(\!)?(?=\s*
3047+ (?x)([_$[:alpha:]][_$[:alnum:]]*)(?=\s*
3463 # function assignment |
3048 # function assignment |
3464 (=\s*(
3049 (=\s*(
3465 ((async\s+)?(
3050 ((async\s+)?(
@@ -3468,11 +3053,11 @@ contexts:
3468 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
3053 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
3469 )) |
3054 )) |
3470 ((async\s*)?(
3055 ((async\s*)?(
3471− ((<\s*$)|([\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
3056+ ((<\s*$)|([\(]\s*([\{\[]\s*)?$)) |
3472 # sure shot arrow functions even if => is on new line
3057 # sure shot arrow functions even if => is on new line
3473 (
3058 (
3474− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
3059+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*>\s*)?
3475− [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
3060+ [(]\s*
3476 (
3061 (
3477 ([)]\s*:) | # ():
3062 ([)]\s*:) | # ():
3478 ((\.\.\.\s*)?[_$[:alpha:]][_$[:alnum:]]*\s*:) # [(]param: | [(]...param:
3063 ((\.\.\.\s*)?[_$[:alpha:]][_$[:alnum:]]*\s*:) # [(]param: | [(]...param:
@@ -3483,9 +3068,9 @@ contexts:
3483 ) |
3068 ) |
3484 # arrow function possible to detect only with => on same line
3069 # arrow function possible to detect only with => on same line
3485 (
3070 (
3486− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
3071+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*>\s*)? # typeparameters
3487− \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
3072+ \(\s*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()]|(\(([^\(\)]|(\([^\(\)]*\)))*\)))*)?\) # parameters
3488− (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
3073+ (\s*:\s*([^<>\(\)]|\<[^<>]+\>|\([^\(\)]+\))+)? # return type
3489 \s*=> # arrow operator
3074 \s*=> # arrow operator
3490 )
3075 )
3491 ))
3076 ))
@@ -3502,20 +3087,19 @@ contexts:
3502 ))
3087 ))
3503 ))
3088 ))
3504 )) |
3089 )) |
3505− (:\s*(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))Function(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))) |
3090+ (:\s*((<\s*$)|([\(]\s*([\{\[]\s*)?$))) |
3506− (:\s*((<\s*$)|([\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*))))))) |
3091+ (:\s*(=>|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(<[^<>]*>)|[^<>(),=])+=\s*(
3507− (:\s*(=>|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(<[^<>]*>)|[^<>(),=])+=\s*(
3508 ((async\s+)?(
3092 ((async\s+)?(
3509 (function\s*[(<*]) |
3093 (function\s*[(<*]) |
3510 (function\s+) |
3094 (function\s+) |
3511 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
3095 ([_$[:alpha:]][_$[:alnum:]]*\s*=>)
3512 )) |
3096 )) |
3513 ((async\s*)?(
3097 ((async\s*)?(
3514− ((<\s*$)|([\(]\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})\s*((:\s*\{?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])\s*((:\s*\[?$)|((\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))) |
3098+ ((<\s*$)|([\(]\s*([\{\[]\s*)?$)) |
3515 # sure shot arrow functions even if => is on new line
3099 # sure shot arrow functions even if => is on new line
3516 (
3100 (
3517− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)?
3101+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*>\s*)?
3518− [(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
3102+ [(]\s*
3519 (
3103 (
3520 ([)]\s*:) | # ():
3104 ([)]\s*:) | # ():
3521 ((\.\.\.\s*)?[_$[:alpha:]][_$[:alnum:]]*\s*:) # [(]param: | [(]...param:
3105 ((\.\.\.\s*)?[_$[:alpha:]][_$[:alnum:]]*\s*:) # [(]param: | [(]...param:
@@ -3526,37 +3110,34 @@ contexts:
3526 ) |
3110 ) |
3527 # arrow function possible to detect only with => on same line
3111 # arrow function possible to detect only with => on same line
3528 (
3112 (
3529− (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\]))([^=<>]|=[^<])*\>)*\>)*>\s*)? # typeparameters
3113+ (<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<]|\<\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=<>]|=[^<])*\>)*>\s*)? # typeparameters
3530− \(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{([^\{\}]|\{[^\{\}]*\})*\}))*\})|(\[([^\[\]]|(\[([^\[\]]|\[[^\[\]]*\])*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()\'\"\`]|(\(([^\(\)]|(\(([^\(\)]|\([^\(\)]*\))*\)))*\))|(\'([^\'\\]|\\.)*\')|(\"([^\"\\]|\\.)*\")|(\`([^\`\\]|\\.)*\`))*)?\) # parameters
3114+ \(\s*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()]|(\(([^\(\)]|(\([^\(\)]*\)))*\)))*)?\) # parameters
3531− (\s*:\s*([^<>\(\)\{\}]|\<([^<>]|\<([^<>]|\<[^<>]+\>)+\>)+\>|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
3115+ (\s*:\s*([^<>\(\)]|\<[^<>]+\>|\([^\(\)]+\))+)? # return type
3532 \s*=> # arrow operator
3116 \s*=> # arrow operator
3533 )
3117 )
3534 ))
3118 ))
3535 )))
3119 )))
3536 captures:
3120 captures:
3537 1: meta.definition.variable.tsx entity.name.function.tsx
3121 1: meta.definition.variable.tsx entity.name.function.tsx
3538− 2: keyword.operator.definiteassignment.tsx
3539 push:
3122 push:
3540 - meta_scope: meta.var-single-variable.expr.tsx
3123 - meta_scope: meta.var-single-variable.expr.tsx
3541− - match: '(?=$|^|[;,=}]|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(of|in)\s+))'
3124+ - match: '(?=$|^|[;,=}]|(\s+(of|in)\s+))'
3542 pop: true
3125 pop: true
3543 - include: var-single-variable-type-annotation
3126 - include: var-single-variable-type-annotation
3544− - match: '([[:upper:]][_$[:digit:][:upper:]]*)(?![_$[:alnum:]])(\!)?'
3127+ - match: "([[:upper:]][_$[:digit:][:upper:]]*)(?![_$[:alnum:]])"
3545 captures:
3128 captures:
3546 1: meta.definition.variable.tsx variable.other.constant.tsx
3129 1: meta.definition.variable.tsx variable.other.constant.tsx
3547− 2: keyword.operator.definiteassignment.tsx
3548 push:
3130 push:
3549 - meta_scope: meta.var-single-variable.expr.tsx
3131 - meta_scope: meta.var-single-variable.expr.tsx
3550− - match: '(?=$|^|[;,=}]|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(of|in)\s+))'
3132+ - match: '(?=$|^|[;,=}]|(\s+(of|in)\s+))'
3551 pop: true
3133 pop: true
3552 - include: var-single-variable-type-annotation
3134 - include: var-single-variable-type-annotation
3553− - match: '([_$[:alpha:]][_$[:alnum:]]*)(\!)?'
3135+ - match: "([_$[:alpha:]][_$[:alnum:]]*)"
3554 captures:
3136 captures:
3555 1: meta.definition.variable.tsx variable.other.readwrite.tsx
3137 1: meta.definition.variable.tsx variable.other.readwrite.tsx
3556− 2: keyword.operator.definiteassignment.tsx
3557 push:
3138 push:
3558 - meta_scope: meta.var-single-variable.expr.tsx
3139 - meta_scope: meta.var-single-variable.expr.tsx
3559− - match: '(?=$|^|[;,=}]|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(of|in)\s+))'
3140+ - match: '(?=$|^|[;,=}]|(\s+(of|in)\s+))'
3560 pop: true
3141 pop: true
3561 - include: var-single-variable-type-annotation
3142 - include: var-single-variable-type-annotation
3562 var-single-variable-type-annotation:
3143 var-single-variable-type-annotation:
@@ -3564,17 +3145,17 @@ contexts:
3564 - include: string
3145 - include: string
3565 - include: comment
3146 - include: comment
3566 variable-initializer:
3147 variable-initializer:
3567− - match: (?<!=|!)(=)(?!=)(?=\s*\S)(?!\s*.*=>\s*$)
3148+ - match: (?<!=|!)(=)(?!=)(?=\s*\S)
3568 captures:
3149 captures:
3569 1: keyword.operator.assignment.tsx
3150 1: keyword.operator.assignment.tsx
3570 push:
3151 push:
3571− - match: '(?=$|^|[,);}\]]|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(of|in)\s+))'
3152+ - match: '(?=$|^|[,);}\]])'
3572 pop: true
3153 pop: true
3573 - include: expression
3154 - include: expression
3574 - match: (?<!=|!)(=)(?!=)
3155 - match: (?<!=|!)(=)(?!=)
3575 captures:
3156 captures:
3576 1: keyword.operator.assignment.tsx
3157 1: keyword.operator.assignment.tsx
3577 push:
3158 push:
3578− - match: '(?=[,);}\]]|((?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(of|in)\s+))|(?=^\s*$)|(?<=\S)(?<!=)(?=\s*$)'
3159+ - match: '(?=[,);}\]])|(?=^\s*$)|(?<=\S)(?<!=)(?=\s*$)'
3579 pop: true
3160 pop: true
3580 - include: expression
3161 - include: expression
assets/syntaxes/02_Extra/VimL+1−1

Submodule changed.

assets/syntaxes/02_Extra/VimL.sublime-syntaxnew file+91
@@ -0,0 +1,91 @@
1+%YAML 1.2
2+---
3+# http://www.sublimetext.com/docs/3/syntax.html
4+name: VimL
5+file_extensions:
6+ - vim
7+ - .vimrc
8+scope: source.viml
9+contexts:
10+ main:
11+ - include: comment
12+ - include: string_quoted_double
13+ - include: string_quoted_single
14+ - include: string_regex
15+ - include: inline_comment
16+ - include: number_int
17+ - include: number_hex
18+ - include: keyword
19+ - include: support_function
20+ - include: support_variable
21+ - include: support_type
22+ - include: function_params
23+ - include: function_definition
24+ - include: function_call
25+ - include: function
26+ - include: variable
27+ - include: expr
28+ comment:
29+ - match: ^\s*".*$
30+ scope: comment.line.quotes.viml
31+ captures:
32+ 1: punctuation.definition.comment.vim
33+ expr:
34+ - match: (\|\||&&|==(\?|#)?|(!|>|<)=(#|\?)?|(=|!)~(#|\?)?|(>|<)(#|\?)is|isnot|\.|\*|\\|%)
35+ scope: storage.function.viml
36+ function:
37+ - match: \b(fu(n|nction)?|end(f|fu|fun|function)?)\b
38+ scope: storage.function.viml
39+ function_call:
40+ - match: '(([sgbwtl]|)?:?[0-9a-zA-Z_#]+)(?=\()'
41+ scope: support.function.any-method
42+ function_definition:
43+ - match: '^\s*(function)\s*!?\s+(?=(s:)?[0-9a-zA-Z_#]+\s*\()'
44+ captures:
45+ 1: storage.function.viml
46+ push:
47+ - meta_scope: meta.function.viml
48+ - match: (\()
49+ captures:
50+ 1: punctuation.definition.parameters.begin.viml
51+ pop: true
52+ - match: "(s:)?[0-9a-zA-Z_#]+"
53+ scope: entity.name.function.viml
54+ function_params:
55+ - match: '-\w+='
56+ scope: support.type.viml
57+ inline_comment:
58+ - match: '(?!\$)(")(?!\{).*$\n?'
59+ scope: comment.line.quotes.viml
60+ captures:
61+ 1: punctuation.definition.comment.vim
62+ keyword:
63+ - match: \b(if|while|for|try|return|throw|end(if|for|while|try)?|au(g|group)|else(if|)?|do|in|catch|finally|:)\b
64+ scope: keyword.control.viml
65+ number_hex:
66+ - match: "0x[0-9a-f]+"
67+ scope: constant.numeric.hex
68+ number_int:
69+ - match: '-?\d+'
70+ scope: constant.numeric.integer
71+ string_quoted_double:
72+ - match: '"(\\\\|\\"|\n[^\S\n]*\\|[^\n"])*"'
73+ scope: string.quoted.double.viml
74+ string_quoted_single:
75+ - match: '''(''''|\n[^\S\n]*\\|[^\n''])*'''
76+ scope: string.quoted.single.viml
77+ string_regex:
78+ - match: '/(\\\\|\\/|\n[^\S\n]*\\|[^\n/])*/'
79+ scope: string.regexp.viml
80+ support_function:
81+ - match: \b(set(local|global)?|let|command|filetype|colorscheme|\w*map|\w*a(b|brev)?|syn|exe(c|cute)?|ec(ho|)?|au(tocmd|)?)\b
82+ scope: support.function.viml
83+ support_type:
84+ - match: <.*?>
85+ scope: support.type.viml
86+ support_variable:
87+ - match: '\b(am(enu|)?|(hl|inc)?search|[Bb]uf([Nn]ew[Ff]ile|[Rr]ead)?|[Ff]ile[Tt]ype)\b'
88+ scope: support.variable.viml
89+ variable:
90+ - match: '([sSgGbBwWlLaAvV]:|@|$|&(?!&))\w*'
91+ scope: variable.other.viml
assets/syntaxes/02_Extra/Zigdeleted−1

Submodule changed.

assets/syntaxes/02_Extra/cmd-helpdeleted−1

Submodule changed.

assets/syntaxes/02_Extra/gnuplotdeleted−1

Submodule changed.

assets/syntaxes/02_Extra/gnuplot.sublime-syntaxdeleted−182
@@ -1,182 +0,0 @@
1−%YAML 1.2
2−---
3−# http://www.sublimetext.com/docs/3/syntax.html
4−name: gnuplot
5−file_extensions:
6− - gp
7− - gpl
8− - gnuplot
9− - gnu
10− - plot
11− - plt
12−scope: source.gnuplot
13−contexts:
14− main:
15− - include: number
16− - include: string_single
17− - include: string_double
18− - match: '\b(for)\b\s*(\[)'
19− comment: |
20− gnuplot iteration statement.
21− There are two forms:
22− numeric [n = 1:2{:inc}]
23− string based [str in "x y z"]
24− but both can also iterate over lists etc, so this is kept loose.
25− captures:
26− 1: keyword.other.iteration.gnuplot
27− 2: punctuation.definition.range.begin.gnuplot
28− push:
29− - meta_scope: meta.structure.iteration.gnuplot
30− - match: '\]'
31− captures:
32− 0: punctuation.definition.range.end.gnuplot
33− pop: true
34− - include: number
35− - include: operator
36− - include: string_double
37− - include: string_single
38− - match: ":"
39− scope: punctuation.separator.range.gnuplot
40− - match: '\b([a-zA-Z]\w*)\b\s*(=|in)'
41− scope: variable-assignment.range.gnuplot
42− - match: '(?i:[^\s(pi|e)\]])'
43− scope: invalid.illegal.expected-range-separator.gnuplot
44− - match: '\['
45− comment: "gnuplot range statement [a:b]. Lots of things are legal, still more make no sense!"
46− captures:
47− 0: punctuation.definition.range.begin.gnuplot
48− push:
49− - meta_scope: meta.structure.range.gnuplot
50− - match: '\]'
51− captures:
52− 0: punctuation.definition.range.end.gnuplot
53− pop: true
54− - include: number
55− - include: operator
56− - match: ":"
57− scope: punctuation.separator.range.gnuplot
58− - match: '(?i:[^\s(pi|e)\]])'
59− scope: invalid.illegal.expected-range-separator.gnuplot
60− - match: \\.
61− scope: constant.character.escape.gnuplot
62− - match: '(?<!\$)(#)(?!\{).*$\n?'
63− scope: comment.line.number-sign.gnuplot
64− captures:
65− 1: punctuation.definition.comment.gnuplot
66− - match: for
67− comment: introduce in gnuplot 4.3.
68− scope: keyword.other.iteration.gnuplot
69− - match: \b(angles|arrow|autoscale|bars|border|boxwidth|clabel|clip|cntrparam|colorbox|contour|decimalsign|dgrid3d|dummy|encoding|fit|format|grid|hidden3d|historysize|isosamples|key|label|locale|logscale|macros|bmargin|lmargin|rmargin|tmargin|mapping|mouse|multiplot|offsets|origin|output|palette|parametric|pm3d|pointsize|polar|print|rrange|trange|urange|vrange|samples|size|style|surface|tics|ticscale|ticslevel|timestamp|timefmt|title|view|xyplane|x2data|xdata|y2data|ydata|z2data|zdata|x2label|xlabel|y2label|ylabel|z2label|zlabel|x2range|xrange|y2range|yrange|z2range|zrange|mx2tics|mxtics|my2tics|mytics|mz2tics|mztics|nomx2tics|nomxtics|nomy2tics|nomytics|nomz2tics|nomztics|nox2tics|noxtics|noy2tics|noytics|noz2tics|noztics|x2tics|xtics|y2tics|ytics|z2tics|ztics|x2dtics|x2mtics|xdtics|xmtics|y2dtics|y2mtics|ydtics|ymtics|z2dtics|z2mtics|zdtics|zmtics|x2zeroaxis|xzeroaxis|y2zeroaxis|yzeroaxis|z2zeroaxis|zeroaxis|zzeroaxis|zero|)\b
70− scope: keyword.other.setting.gnuplot
71− - match: \b(cd|call|clear|exit|plot|splot|help|load|pause|quit|fit|replot|if|FIT_LIMIT|FIT_MAXITER|FIT_START_LAMBDA|FIT_LAMBDA_FACTOR|FIT_LOG|FIT_SCRIPT|print|pwd|reread|reset|save|show|test|!|functions|var)\b
72− comment: missuse of scopes alert! Just for pretty colours
73− scope: keyword.other.command.gnuplot
74− - match: \b(abs|acos|acosh|arg|asin|asinh|atan|atan2|atanh|besj0|besj1|besy0|besy1|ceil|cos|cosh|erf|erfc|exp|floor|gamma|ibeta|igamma|imag|int|inverf|invnorm|lambertw|lgamma|log|log10|norm|rand|real|sgn|sin|sinh|sqrt|tan|tanh)\b
75− scope: support.function.gnuplot
76− - match: \b(gprintf|sprintf|strlen|strstrt|substr|system|word|words)\b
77− scope: support.function.string.gnuplot
78− - match: \b(on|off|default|inside|outside|lmargin|rmargin|tmargin|bmargin|at|left|right|center|top|bottom|center|vertical|horizontal|Left|Right|noreverse|noinvert|samplen|spacing|width|height|noautotitle|columnheader|title|noenhanced|nobox|linestyle|ls|linetype|lt|linewidth|lw)\b
79− scope: constant.other.type.gnuplot
80− - match: \b(aed512|aed767|aifm|aqua|bitgraph|cgm|corel|dumb|dxf|eepic|emf|emtex|epslatex|epson_180dpi|epson_60dpi|epson_lx800|fig|gif|gpic|hp2623A|hp2648|hp500c|hpdj|hpgl|hpljii|hppj|imagen|jpeg|kc_tek40xx|km_tek40xx|latex|mf|mif|mp|nec_cp6|okidata|pbm|pcl5|pdf|png|postscript|pslatex|pstex|pstricks|qms|regis|selanar|starc|svg|tandy_60dpi|tek40xx|tek410x|texdraw|tgif|tkcanvas|tpic|unknown|vttek)\b
81− scope: constant.other.terminal.gnuplot
82− - match: \b(u(sing)?|t(it(le)?)?|notit(le)?|w(i(th)?)?|steps|fs(teps)?|notitle|l(i(nes)?)?|linespoints|via)\b
83− scope: keyword.modifier.gnuplot
84− - match: |-
85− (?x:
86− \b # Start with a word boundary
87− (?=\b[\w$]*(\(|.*=)) # Look-ahead for a bracket or equals
88− (?![^(]*\)) # negative look ahead for a closing bracket without an opening one. This stops a from matching in f(a)
89− ( # Group variable name
90− [A-Za-z] # A letter
91− [\w$]* # Any word chars or $
92− ) # That is it for the name.
93− )
94− comment: user defined function / variable
95− scope: variable.other.gnuplot
96− - match: \b(if)\b
97− scope: keyword.control.gnuplot
98− - match: \b(show)\b
99− captures:
100− 0: keyword.other.command.gnuplot
101− push:
102− - meta_scope: keyword.line.show.gnuplot
103− - meta_content_scope: keyword.line.show.gnuplot
104− - match: (?!\#)($\n?)
105− pop: true
106− - include: main
107− - match: \b(set)\b\s*\b(terminal|term)\b
108− captures:
109− 1: keyword.other.command.gnuplot
110− 2: keyword.other.setting.gnuplot
111− push:
112− - meta_scope: keyword.line.set.terminal.gnuplot
113− - match: (?!\#)($\n?)
114− pop: true
115− - include: main
116− - match: \b(set)\b\s*\b(key)\b
117− captures:
118− 1: keyword.other.command.gnuplot
119− 2: keyword.other.setting.gnuplot
120− push:
121− - meta_scope: keyword.line.set.key.gnuplot
122− - match: (?!\#)($\n?)
123− pop: true
124− - include: main
125− - match: \b(set|unset)\b\s*(?!\b(terminal|key|for)\b)
126− captures:
127− 1: keyword.other.command.gnuplot
128− 2: keyword.other.setting.gnuplot
129− push:
130− - meta_scope: keyword.line.set.gnuplot
131− - meta_content_scope: keyword.line.set.gnuplot
132− - match: (?!\#)($\n?)
133− pop: true
134− - include: main
135− number:
136− - match: |-
137− (?x: # turn on extended mode
138− -? # an optional minus
139− (?:
140− 0 # a zero
141− | # ...or...
142− [1-9] # a 1-9 character
143− \d* # followed by zero or more digits
144− )
145− (?:
146− \. # a period
147− \d+ # followed by one or more digits
148− (?:
149− [eE] # an e character
150− [+-]? # followed by an option +/-
151− \d+ # followed by one or more digits
152− )? # make exponent optional
153− )? # make decimal portion optional
154− )
155− comment: borrowed from textmate book
156− scope: constant.numeric.gnuplot
157− operator:
158− - match: \s*(==|~=|>|>=|<|<=|&|&&|:|\||\|\||\+|-|\*|\.\*|/|\./|\\|\.\\|\^|\.\^)\s*
159− comment: Operator symbols
160− scope: keyword.operator.symbols.matlab
161− string_double:
162− - match: '"'
163− captures:
164− 0: punctuation.definition.string.begin.gnuplot
165− push:
166− - meta_scope: string.quoted.double.gnuplot
167− - match: '"'
168− captures:
169− 0: punctuation.definition.string.end.gnuplot
170− pop: true
171− - match: '\\[\$`"\\\n]'
172− scope: constant.character.escape.gnuplot
173− string_single:
174− - match: "'"
175− captures:
176− 0: punctuation.definition.string.begin.gnuplot
177− push:
178− - meta_scope: string.quoted.single.gnuplot
179− - match: "'"
180− captures:
181− 0: punctuation.definition.string.end.gnuplot
182− pop: true
assets/syntaxes/02_Extra/http-request-responsedeleted−1

Submodule changed.

assets/syntaxes/02_Extra/log.sublime-syntaxdeleted−140
@@ -1,140 +0,0 @@
1−%YAML 1.2
2−---
3−# See http://www.sublimetext.com/docs/3/syntax.html
4−file_extensions:
5− - log
6−scope: text.log
7−variables:
8− ipv4_part: (?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)
9− hours_minutes_seconds: (?:[01]\d|2[0-3]):(?:[0-5]\d):(?:[0-5]\d)
10−contexts:
11− main:
12− - match: (\w+)(=)
13− captures:
14− 1: variable.parameter.log
15− 2: keyword.operator.assignment.log
16− - match: (')([^']*)(')
17− scope: string.quoted.single.log
18− captures:
19− 1: punctuation.definition.string.begin.log
20− 3: punctuation.definition.string.end.log
21− - match: \"
22− captures:
23− 1: punctuation.definition.string.begin.log
24− push: double_quoted_string
25− - include: dates
26− - include: ip_addresses
27− - include: numbers
28− - match: \b(?i:fail(?:ure|ed)?|error|exception)\b
29− scope: markup.error.log
30− - match: \b(?i:warn(?:ing)?)\b
31− scope: markup.warning.log
32− - match: \b(?i:debug)\b
33− scope: markup.info.log
34− #- include: scope:text.html.markdown#autolink-inet
35− - match: \b\w+:/{2,3}
36− scope: markup.underline.link.scheme.log
37− push: url-host
38− dates:
39− - match: \b\d{4}-\d{2}-\d{2}(?=\b|T)
40− scope: meta.date.log meta.number.integer.decimal.log constant.numeric.value.log
41− push: maybe_date_time_separator
42− - match: \b\d{4}/\d{2}/\d{2}(?=\b|T)
43− scope: meta.date.log meta.number.integer.decimal.log constant.numeric.value.log
44− push: maybe_date_time_separator
45− - match: \b(?={{hours_minutes_seconds}})
46− push: time
47− time:
48− - match: (?:{{hours_minutes_seconds}})(?:(\.)\d{3})?\b
49− scope: meta.time.log meta.number.integer.decimal.log constant.numeric.value.log
50− captures:
51− 1: punctuation.separator.decimal.log
52− - match: ''
53− pop: true
54− maybe_date_time_separator:
55− - match: T(?={{hours_minutes_seconds}})
56− scope: meta.date.log meta.time.log keyword.other.log
57− set: time
58− - match: ''
59− pop: true
60− ip_addresses:
61− - match: \b(?=(?:{{ipv4_part}}\.){3}{{ipv4_part}}\b)
62− push:
63− - meta_scope: meta.ipaddress.v4.log meta.number.integer.decimal.log
64− - match: \d+
65− scope: constant.numeric.value.log
66− - match: \.
67− scope: punctuation.separator.sequence.log
68− - match: ''
69− pop: true
70− - match: (?=(?:\h{0,4}:){2,6}\h{1,4}\b)
71− push:
72− - meta_scope: meta.ipaddress.v6.log meta.number.integer.hexadecimal.log
73− - match: \h{1,4}
74− scope: constant.numeric.value.log
75− - match: ':'
76− scope: punctuation.separator.sequence.log
77− - match: ''
78− pop: true
79− numbers:
80− - match: \b(0x)(\h+)(?:(\.)(\h+))?\b
81− scope: meta.number.float.hexadecimal.log
82− captures:
83− 1: constant.numeric.base.log
84− 2: constant.numeric.value.log
85− 3: constant.numeric.value.log punctuation.separator.decimal.log
86− 4: constant.numeric.value.log
87− - match: \b\d+(\.)\d+\b
88− scope: meta.number.float.log constant.numeric.value.log
89− captures:
90− 1: punctuation.separator.decimal.log
91− - match: \b\d+\b
92− scope: meta.number.integer.log constant.numeric.value.log
93− url-host:
94− - meta_content_scope: markup.underline.link.host.log
95− - match: \[
96− scope: punctuation.section.brackets.begin.log
97− push:
98− - match: \]
99− scope: punctuation.section.brackets.end.log
100− pop: true
101− - include: ip_addresses
102− - match: '[^:/\s]+'
103− - match: ''
104− set: url-after-host
105− url-after-host:
106− - match: (:)(\d+)
107− scope: markup.underline.link.port.log
108− captures:
109− 1: punctuation.separator.mapping.port.log
110− 2: constant.numeric.value.log
111− #- include: scope:text.html.markdown#url-escaped-chars
112− - match: (%)\h{2}
113− scope: markup.underline.link.path.log constant.character.escape.url.log
114− captures:
115− 1: punctuation.definition.escape.log
116− # After a valid domain, zero or more non-space non-< characters may follow
117− - match: (?=[?!.,:*_~]*[\s<]) # Trailing punctuation (specifically, ?, !, ., ,, :, *, _, and ~) will not be considered part of the autolink, though they may be included in the interior of the link
118− pop: true
119− - match: \( # When an autolink ends in ), we scan the entire autolink for the total number of parentheses. If there is a greater number of closing parentheses than opening ones, we don’t consider the last character part of the autolink, in order to facilitate including an autolink inside a parenthesis
120− push:
121− - meta_scope: markup.underline.link.path.log
122− - match: (?=[?!.,:*_~]*[\s<])
123− pop: true
124− - match: \)
125− pop: true
126− - match: (?=\)[?!.,:*_~]*[\s<])
127− pop: true
128− - match: '[^?!.,:*_~\s<&()%]+|\S'
129− scope: markup.underline.link.path.log
130− - match: ''
131− pop: true
132− double_quoted_string:
133− - meta_scope: string.quoted.double.log
134− - match: \\"
135− scope: constant.character.escape.log
136− - match: \\n
137− scope: constant.character.escape.log
138− - match: \"
139− scope: punctuation.definition.string.end.log
140− pop: true
assets/syntaxes/02_Extra/requirementstxtnew file+1

Submodule changed.

assets/syntaxes/02_Extra/requirementstxt.sublime-syntaxnew file+19
@@ -0,0 +1,19 @@
1+%YAML 1.2
2+---
3+# http://www.sublimetext.com/docs/3/syntax.html
4+name: requirements.txt
5+file_extensions:
6+ - requirements.txt
7+scope: source.requirementstxt
8+contexts:
9+ main:
10+ - match: (#).*$\n?
11+ scope: comment.line.requirementstxt
12+ captures:
13+ 1: punctuation.definition.comment.requirementstxt
14+ - match: '(?i)^[a-z0-9_\-\.]+'
15+ scope: string.package_name.requirementstxt
16+ - match: (?i)==|<|<=|>=|>
17+ scope: keyword.operator.logical.punctuation.requirementstxt
18+ - match: '(?i)\d+\.[\da-z\-_\.]*'
19+ scope: constant.numeric.verions.requirementstxt
assets/syntaxes/02_Extra/ssh-config+1−1

Submodule changed.

assets/syntaxes/02_Extra/syntax_test_csv.csvdeleted−60
@@ -1,60 +0,0 @@
1−# SYNTAX TEST "CSV.sublime-syntax"
2−Forename,Surname,House No.,Street,City,Postcode
3−#^^^^^^^ meta.field-1
4−# ^ punctuation.separator.sequence
5−# ^^^^^^^ meta.field-2
6−# ^ punctuation.separator.sequence
7−# ^^^^^^^^^ meta.field-3
8−# ^ punctuation.separator.sequence
9−# ^^^^^^ meta.field-4
10−# ^ punctuation.separator.sequence
11−# ^^^^ meta.field-1
12−# ^ punctuation.separator.sequence
13−# ^^^^^^^^ meta.field-2
14−John,Doe,87,Logon Road,Citiville,TU43 6GH
15−#^^^ meta.field-1
16−# ^ punctuation.separator.sequence
17−# ^^^ meta.field-2
18−# ^ punctuation.separator.sequence
19−# ^^ meta.field-3
20−# ^ punctuation.separator.sequence
21−# ^^^^^^^^^^ meta.field-4
22−# ^ punctuation.separator.sequence
23−# ^^^^^^^^^ meta.field-1
24−# ^ punctuation.separator.sequence
25−# ^^^^^^^^ meta.field-2
26−Jane,Doe,22,"""Fun"" Street","The City, County",FA90 1XA
27−#^^^ meta.field-1
28−# ^ punctuation.separator.sequence
29−# ^^^ meta.field-2
30−# ^ punctuation.separator.sequence
31−# ^^ meta.field-3
32−# ^ punctuation.separator.sequence
33−# ^^^^^^^^^^^^^^^^ meta.field-4 string.quoted.double
34−# ^^ constant.character.escape
35−# ^^ constant.character.escape
36−# ^ punctuation.separator.sequence
37−# ^ meta.field-1 string.quoted.double punctuation.definition.string.begin
38−# ^^^^^^^^^^^^^^^^^ meta.field-1 string.quoted.double
39−# ^ meta.field-1 string.quoted.double punctuation.definition.string.end
40−# ^ punctuation.separator.sequence
41−# ^^^^^^^^ meta.field-2
42−Fred,Bloggs,"19","Street
43−#^^^ meta.field-1
44−# ^ punctuation.separator.sequence
45−# ^^^^^^ meta.field-2
46−# ^ punctuation.separator.sequence
47−# ^^^ meta.field-3 string.quoted.double
48−# ^ punctuation.separator.sequence
49−# ^ meta.field-4 punctuation.definition.string.begin
50−# ^^^^^^^^ meta.field-4 string.quoted.double
51−Spanning Multiple ""
52−#^^^^^^^^^^^^^^^^^^^^ meta.field-4 string.quoted.double
53−# ^^ constant.character.escape
54−Lines",Citee,P0stc0d3
55−#^^^^^ meta.field-4 string.quoted.double
56−# ^ meta.field-4 punctuation.definition.string.end
57−# ^ punctuation.separator.sequence
58−# ^^^^^ meta.field-1
59−# ^ punctuation.separator.sequence
60−# ^^^^^^^^ meta.field-2
assets/syntaxes/02_Extra/syntax_test_man.mandeleted−162
@@ -1,162 +0,0 @@
1−# SYNTAX TEST "Manpage.sublime-syntax"
2−SOMETHING(8) System Manager's Manual SOMETHING(8)
3−# ^^^^^ meta.preprocessor
4−# ^^^^^^^^^^^^^^^^^^^^^^^ markup.heading.title
5−# ^^^^^^^ meta.preprocessor
6−
7−NAME
8−#^^^ markup.heading.other
9− example - do something useful
10−
11−SYNOPSIS
12− example [options] [--home DIR] [--shell SHELL] [--no-create-home]
13−# ^ punctuation.section.brackets.begin
14−# ^^^^^^ entity.name.command-line-option
15−# ^^^ variable.parameter
16−# ^ punctuation.section.brackets.end
17−# ^ punctuation.section.brackets.begin
18−# ^^^^^^^ entity.name.command-line-option
19−# ^^^^^ variable.parameter
20−# ^ punctuation.section.brackets.end
21−# ^ punctuation.section.brackets.begin
22−# ^^^^^^^^^^^^^^^^ entity.name.command-line-option
23−# ^ punctuation.section.brackets.end
24− [-u | --set-upstream] [-o <string> | --push-option=<string>]
25−# ^ punctuation.section.brackets.begin
26−# ^^ entity.name.command-line-option
27−# ^ keyword.operator.logical
28−# ^^^^^^^^^^^^^^ entity.name.command-line-option
29−# ^ punctuation.section.brackets.end
30−# ^^^^^^^^^^^^^ entity.name.command-line-option
31− [--force-with-lease[=<refname>[:<expect>]]]
32−# ^ punctuation.section.brackets.begin
33−# ^^^^^^^^^^^^^^^^^^ entity.name.command-line-option
34−# ^ punctuation.section.brackets.begin
35−# ^ keyword.operator
36−# ^^^^^^^ variable.parameter
37−# ^ punctuation.section.brackets.begin
38−# ^^^^^^ variable.parameter
39−# ^^^ punctuation.section.brackets.end
40−
41− example --system [options]
42−# ^^^^^^^^ entity.name
43−
44− COMMON OPTIONS
45− [--quiet] [--debug] [--help|-h] [--version] [--conf FILE]
46−
47− /* According to POSIX.1-2001, POSIX.1-2008 */
48−# ^^ source.c comment.block punctuation.definition.comment
49− #include <sys/select.h>
50−# ^^^^^^^^ source.c meta.preprocessor.include keyword.control.import.include
51− struct timeval {
52−# ^^^^^^ source.c storage.type
53−
54− time_t tv_sec; /* seconds */
55− suseconds_t tv_usec; /* microseconds */
56− };
57−
58−
59−
60−DESCRIPTION
61− example does something useful in relation to the command line options
62− and configuration information in /etc/example.conf.
63−
64−OPTIONS
65− --conf FILE
66−# ^^^^^^ entity.name.command-line-option
67−#^^^^^^ - variable - entity - markup
68−# ^^^^ variable.parameter
69− Use FILE instead of /etc/example.conf.
70−# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - variable - entity
71−
72− --disabled-login
73− Do not run passwd to set the password. The user won't be able
74− to use her account until the password is set.
75−
76− --disabled-password
77− Like --disabled-login, but logins are still possible (for exam-
78−# ^^^^^^^^^^^^^^^^ entity.name
79−#^^^^^^^^^^^^^^^^^^ - entity - variable - markup
80−# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - entity - variable - markup
81− ple using SSH RSA keys) but not using password authentication.
82−
83− --help Display brief instructions.
84−# ^^^^^^ entity.name.command-line-option
85−# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - variable.parameter
86−
87− --home DIR
88−# ^^^^^^ entity.name.command-line-option
89−# ^^^ variable.parameter
90−# ^ - variable - entity - markup
91− Use DIR as the user's home directory, rather than the default
92− specified by the configuration file. If the directory does not
93− exist, it is created and skeleton files are copied.
94−
95− --[no-]signed, --signed=(true|false|if-asked)
96−# ^^^^^^^^^^^^^ entity.name.command-line-option
97−# ^ punctuation.separator
98−# ^^^^^^^^ entity.name.command-line-option
99−# ^ keyword.operator
100−# ^ - variable
101−# ^^^^ variable.parameter
102−# ^ keyword.operator.logical
103−# ^^^^^ variable.parameter
104−# ^ keyword.operator.logical
105−# ^^^^^^^^ variable.parameter
106−# ^ - variable
107− --no-recurse-submodules, --recurse-submodules=check|on-demand|only|no
108−# ^^^^^^^^^^^^^^^^^^^^^^^ entity.name.command-line-option
109−# ^ punctuation.separator
110−# ^^^^^^^^^^^^^^^^^^^^ entity.name.command-line-option
111−# ^ keyword.operator
112−# ^^^^^ variable.parameter
113−# ^ keyword.operator.logical
114−# ^^^^^^^^^ variable.parameter
115−# ^ keyword.operator.logical
116−# ^^^^ variable.parameter
117−# ^ keyword.operator.logical
118−# ^^ variable.parameter
119− May be used to make sure all submodule commits used by the
120−
121− -c, -C NUM, --context[=NUM]
122−# ^^ entity.name.command-line-option
123−# ^ punctuation.separator
124−# ^^ entity.name.command-line-option
125−# ^^^ variable.parameter
126−# ^ punctuation.separator
127−# ^^^^^^^^^ entity.name.command-line-option
128−# ^^^^^^^ - entity.name
129−# ^ keyword.operator
130−# ^^^ variable.parameter
131−# ^^ - variable
132− output NUM (default 3) lines of copied context
133−
134−EXAMPLE
135− #include <stdio.h>
136−# ^^^^^^^^ source.c meta.preprocessor.include keyword.control.import.include
137−
138− (This is not C code.)
139−# ^^^^^^^^^^^^^^^^^^^^^^ - source.c
140−
141− struct timeval {
142− time_t tv_sec; /* seconds */
143− suseconds_t tv_usec; /* microseconds */
144− };
145−# ^ source.c punctuation.terminator
146−
147− The corresponding argument for pselect() has the following type:
148−#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - source.c
149− #define POLLIN_SET (EPOLLRDNORM | EPOLLRDBAND | EPOLLIN |
150− EPOLLHUP | EPOLLERR)
151−# ^ source.c meta.preprocessor.macro meta.group punctuation.section.group.end
152−
153−ENVIRONMENT
154− $SYSTEMD_LOG_LEVEL
155−# ^ punctuation.definition.variable
156−# ^^^^^^^^^^^^^^^^^ constant.other
157− systemd reads the log level from this environment variable. This
158− can be overridden with --log-level=.
159−
160−SEE ALSO
161− The systemd Homepage[11], systemd-system.conf(5), locale.conf(5)
162−# ^^^^^^^^^^^^^^^^^^^ entity.name.function
assets/syntaxes/02_Extra/syntax_test_tsv.tsvdeleted−60
@@ -1,60 +0,0 @@
1−# SYNTAX TEST "CSV.sublime-syntax"
2−Forename Surname House No. Street City Postcode
3−#^^^^^^^ meta.field-1
4−# ^ punctuation.separator.sequence
5−# ^^^^^^^ meta.field-2
6−# ^ punctuation.separator.sequence
7−# ^^^^^^^^^ meta.field-3
8−# ^ punctuation.separator.sequence
9−# ^^^^^^ meta.field-4
10−# ^ punctuation.separator.sequence
11−# ^^^^ meta.field-1
12−# ^ punctuation.separator.sequence
13−# ^^^^^^^^ meta.field-2
14−John Doe 87 Logon Road Citiville TU43 6GH
15−#^^^ meta.field-1
16−# ^ punctuation.separator.sequence
17−# ^^^ meta.field-2
18−# ^ punctuation.separator.sequence
19−# ^^ meta.field-3
20−# ^ punctuation.separator.sequence
21−# ^^^^^^^^^^ meta.field-4
22−# ^ punctuation.separator.sequence
23−# ^^^^^^^^^ meta.field-1
24−# ^ punctuation.separator.sequence
25−# ^^^^^^^^ meta.field-2
26−Jane Doe 22 """Fun"" Street" "The City County" FA90 1XA
27−#^^^ meta.field-1
28−# ^ punctuation.separator.sequence
29−# ^^^ meta.field-2
30−# ^ punctuation.separator.sequence
31−# ^^ meta.field-3
32−# ^ punctuation.separator.sequence
33−# ^^^^^^^^^^^^^^^^ meta.field-4 string.quoted.double
34−# ^^ constant.character.escape
35−# ^^ constant.character.escape
36−# ^ punctuation.separator.sequence
37−# ^ meta.field-1 string.quoted.double punctuation.definition.string.begin
38−# ^^^^^^^^^^^^^^^^^ meta.field-1 string.quoted.double
39−# ^ meta.field-1 string.quoted.double punctuation.definition.string.end
40−# ^ punctuation.separator.sequence
41−# ^^^^^^^^ meta.field-2
42−Fred Bloggs "19" "Street
43−#^^^ meta.field-1
44−# ^ punctuation.separator.sequence
45−# ^^^^^^ meta.field-2
46−# ^ punctuation.separator.sequence
47−# ^^^ meta.field-3 string.quoted.double
48−# ^ punctuation.separator.sequence
49−# ^ meta.field-4 punctuation.definition.string.begin
50−# ^^^^^^^^ meta.field-4 string.quoted.double
51−Spanning Multiple ""
52−#^^^^^^^^^^^^^^^^^^^^ meta.field-4 string.quoted.double
53−# ^^ constant.character.escape
54−Lines" Citee P0stc0d3
55−#^^^^^ meta.field-4 string.quoted.double
56−# ^ meta.field-4 punctuation.definition.string.end
57−# ^ punctuation.separator.sequence
58−# ^^^^^ meta.field-1
59−# ^ punctuation.separator.sequence
60−# ^^^^^^^^ meta.field-2
assets/syntaxes/02_Extra/syslog.sublime-syntaxdeleted−63
@@ -1,63 +0,0 @@
1−%YAML 1.2
2−---
3−# http://www.sublimetext.com/docs/3/syntax.html
4−name: syslog
5−file_extensions:
6− - syslog
7−scope: text.log.syslog
8−contexts:
9− main:
10− - match: ^(\w+\s+\d+)\s+(\d{2}:\d{2}:\d{2})
11− scope: meta.datetime.syslog constant.numeric.syslog
12− captures:
13− 1: meta.date.syslog
14− 2: meta.time.syslog
15− push: loghost
16− - match: ^
17− push: text
18− loghost:
19− - match: '[\w:.-]+'
20− scope: entity.other.attribute-name.loghost.syslog
21− set: process
22− process:
23− - match: ([\w.-]+)(?:(\[)(\d+)(\]))?([ :])
24− captures:
25− 1: support.function.process.syslog
26− 2: punctuation.separator.pid.begin.syslog
27− 3: meta.pid.syslog meta.number.integer.syslog constant.numeric.value.syslog
28− 4: punctuation.separator.pid.end.syslog
29− 5: punctuation.separator.mapping.syslog
30− set: structured-data
31− structured-data:
32− - match: '\['
33− scope: punctuation.section.mapping.begin.syslog
34− push:
35− - match: \]
36− scope: punctuation.section.mapping.end.syslog
37− pop: true
38− - match: \w+
39− scope: variable.parameter.syslog
40− - match: =
41− scope: keyword.operator.assignment.syslog
42− push:
43− - match: '[^\s\]]+'
44− scope: constant.other.syslog
45− pop: true
46− - match: (?=\])
47− pop: true
48− - match: (?=\S)
49− set: text
50− text:
51− - match: $
52− pop: true
53− - match: '<\w+>'
54− scope: constant.language.syslog
55− - match: \b(CMD)\b\s+(\()
56− captures:
57− 1: entity.name.label.syslog
58− 2: punctuation.section.block.begin.syslog
59− embed: scope:source.shell.bash
60− escape: \)$
61− escape_captures:
62− 0: punctuation.section.block.end.syslog
63− - include: scope:text.log
assets/themes.bin

Binary file not shown.

assets/themes/Coldarkdeleted−1

Submodule changed.

assets/themes/ansi.tmTheme → assets/themes/ansi-dark.tmThemerenamed+87−13
@@ -3,14 +3,14 @@
3<plist version="1.0">
3<plist version="1.0">
4 <dict>
4 <dict>
5 <!--
5 <!--
6− The colors in this theme are encoded as #RRGGBBAA where:
6+ The colors in this theme are encoded as #RRGGBBAA where RR is an ANSI
7− * If AA is 00, then RR is an ANSI palette number from 00 to 07.
7+ palette number from 00 to 0f, and AA is the special value 00 to indicate
8− * If AA is 01, the terminal's default fg/bg color is used.
8+ that this encoding is being used.
9 -->
9 -->
10 <key>author</key>
10 <key>author</key>
11 <string>Template: Chris Kempson, Scheme: Mitchell Kember</string>
11 <string>Template: Chris Kempson, Scheme: Mitchell Kember</string>
12 <key>name</key>
12 <key>name</key>
13− <string>ANSI</string>
13+ <string>ANSI Dark</string>
14 <key>colorSpaceName</key>
14 <key>colorSpaceName</key>
15 <string>sRGB</string>
15 <string>sRGB</string>
16 <key>settings</key>
16 <key>settings</key>
@@ -19,17 +19,32 @@
19 <key>settings</key>
19 <key>settings</key>
20 <dict>
20 <dict>
21 <key>background</key>
21 <key>background</key>
22− <string>#00000001</string>
22+ <string>#00000000</string>
23− <key>foreground</key>
23+ <key>caret</key>
24− <string>#00000001</string>
24+ <string>#07000000</string>
25− <!--
25+ <key>foreground</key>
26− Explicitly set the gutter color since bat falls back to a
26+ <string>#07000000</string>
27− hardcoded DEFAULT_GUTTER_COLOR otherwise.
27+ <key>invisibles</key>
28− -->
28+ <string>#07000000</string>
29+ <key>lineHighlight</key>
30+ <string>#07000000</string>
31+ <key>selection</key>
32+ <string>#07000000</string>
29 <key>gutter</key>
33 <key>gutter</key>
30− <string>#00000001</string>
34+ <string>#00000000</string>
31 <key>gutterForeground</key>
35 <key>gutterForeground</key>
32− <string>#00000001</string>
36+ <string>#07000000</string>
37+ </dict>
38+ </dict>
39+ <dict>
40+ <key>name</key>
41+ <string>Text</string>
42+ <key>scope</key>
43+ <string>variable.parameter.function</string>
44+ <key>settings</key>
45+ <dict>
46+ <key>foreground</key>
47+ <string>#07000000</string>
33 </dict>
48 </dict>
34 </dict>
49 </dict>
35 <dict>
50 <dict>
@@ -43,6 +58,39 @@
43 <string>#02000000</string>
58 <string>#02000000</string>
44 </dict>
59 </dict>
45 </dict>
60 </dict>
61+ <dict>
62+ <key>name</key>
63+ <string>Punctuation</string>
64+ <key>scope</key>
65+ <string>punctuation.definition.string, punctuation.definition.variable, punctuation.definition.string, punctuation.definition.parameters, punctuation.definition.string, punctuation.definition.array</string>
66+ <key>settings</key>
67+ <dict>
68+ <key>foreground</key>
69+ <string>#07000000</string>
70+ </dict>
71+ </dict>
72+ <dict>
73+ <key>name</key>
74+ <string>Delimiters</string>
75+ <key>scope</key>
76+ <string>none</string>
77+ <key>settings</key>
78+ <dict>
79+ <key>foreground</key>
80+ <string>#07000000</string>
81+ </dict>
82+ </dict>
83+ <dict>
84+ <key>name</key>
85+ <string>Operators</string>
86+ <key>scope</key>
87+ <string>keyword.operator</string>
88+ <key>settings</key>
89+ <dict>
90+ <key>foreground</key>
91+ <string>#07000000</string>
92+ </dict>
93+ </dict>
46 <dict>
94 <dict>
47 <key>name</key>
95 <key>name</key>
48 <string>Keywords</string>
96 <string>Keywords</string>
@@ -54,6 +102,17 @@
54 <string>#05000000</string>
102 <string>#05000000</string>
55 </dict>
103 </dict>
56 </dict>
104 </dict>
105+ <dict>
106+ <key>name</key>
107+ <string>Variables</string>
108+ <key>scope</key>
109+ <string>variable</string>
110+ <key>settings</key>
111+ <dict>
112+ <key>foreground</key>
113+ <string>#07000000</string>
114+ </dict>
115+ </dict>
57 <dict>
116 <dict>
58 <key>name</key>
117 <key>name</key>
59 <string>Functions</string>
118 <string>Functions</string>
@@ -87,6 +146,17 @@
87 <string>#03000000</string>
146 <string>#03000000</string>
88 </dict>
147 </dict>
89 </dict>
148 </dict>
149+ <dict>
150+ <key>name</key>
151+ <string>Classes</string>
152+ <key>scope</key>
153+ <string>meta.class</string>
154+ <key>settings</key>
155+ <dict>
156+ <key>foreground</key>
157+ <string>#07000000</string>
158+ </dict>
159+ </dict>
90 <dict>
160 <dict>
91 <key>name</key>
161 <key>name</key>
92 <string>Methods</string>
162 <string>Methods</string>
@@ -410,6 +480,8 @@
410 <dict>
480 <dict>
411 <key>background</key>
481 <key>background</key>
412 <string>#01000000</string>
482 <string>#01000000</string>
483+ <key>foreground</key>
484+ <string>#07000000</string>
413 </dict>
485 </dict>
414 </dict>
486 </dict>
415 <dict>
487 <dict>
@@ -421,6 +493,8 @@
421 <dict>
493 <dict>
422 <key>background</key>
494 <key>background</key>
423 <string>#03000000</string>
495 <string>#03000000</string>
496+ <key>foreground</key>
497+ <string>#00000000</string>
424 </dict>
498 </dict>
425 </dict>
499 </dict>
426 </array>
500 </array>
assets/themes/ansi-light.tmThemenew file+504
@@ -0,0 +1,504 @@
1+<?xml version="1.0" encoding="UTF-8"?>
2+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3+<plist version="1.0">
4+ <dict>
5+ <!--
6+ The colors in this theme are encoded as #RRGGBBAA where RR is an ANSI
7+ palette number from 00 to 0f, and AA is the special value 00 to indicate
8+ that this encoding is being used.
9+ -->
10+ <key>author</key>
11+ <string>Template: Chris Kempson, Scheme: Mitchell Kember</string>
12+ <key>name</key>
13+ <string>ANSI Light</string>
14+ <key>colorSpaceName</key>
15+ <string>sRGB</string>
16+ <key>settings</key>
17+ <array>
18+ <dict>
19+ <key>settings</key>
20+ <dict>
21+ <key>background</key>
22+ <string>#07000000</string>
23+ <key>caret</key>
24+ <string>#00000000</string>
25+ <key>foreground</key>
26+ <string>#00000000</string>
27+ <key>invisibles</key>
28+ <string>#00000000</string>
29+ <key>lineHighlight</key>
30+ <string>#00000000</string>
31+ <key>selection</key>
32+ <string>#00000000</string>
33+ <key>gutter</key>
34+ <string>#07000000</string>
35+ <key>gutterForeground</key>
36+ <string>#00000000</string>
37+ </dict>
38+ </dict>
39+ <dict>
40+ <key>name</key>
41+ <string>Text</string>
42+ <key>scope</key>
43+ <string>variable.parameter.function</string>
44+ <key>settings</key>
45+ <dict>
46+ <key>foreground</key>
47+ <string>#00000000</string>
48+ </dict>
49+ </dict>
50+ <dict>
51+ <key>name</key>
52+ <string>Comments</string>
53+ <key>scope</key>
54+ <string>comment, punctuation.definition.comment</string>
55+ <key>settings</key>
56+ <dict>
57+ <key>foreground</key>
58+ <string>#02000000</string>
59+ </dict>
60+ </dict>
61+ <dict>
62+ <key>name</key>
63+ <string>Punctuation</string>
64+ <key>scope</key>
65+ <string>punctuation.definition.string, punctuation.definition.variable, punctuation.definition.string, punctuation.definition.parameters, punctuation.definition.string, punctuation.definition.array</string>
66+ <key>settings</key>
67+ <dict>
68+ <key>foreground</key>
69+ <string>#00000000</string>
70+ </dict>
71+ </dict>
72+ <dict>
73+ <key>name</key>
74+ <string>Delimiters</string>
75+ <key>scope</key>
76+ <string>none</string>
77+ <key>settings</key>
78+ <dict>
79+ <key>foreground</key>
80+ <string>#00000000</string>
81+ </dict>
82+ </dict>
83+ <dict>
84+ <key>name</key>
85+ <string>Operators</string>
86+ <key>scope</key>
87+ <string>keyword.operator</string>
88+ <key>settings</key>
89+ <dict>
90+ <key>foreground</key>
91+ <string>#00000000</string>
92+ </dict>
93+ </dict>
94+ <dict>
95+ <key>name</key>
96+ <string>Keywords</string>
97+ <key>scope</key>
98+ <string>keyword</string>
99+ <key>settings</key>
100+ <dict>
101+ <key>foreground</key>
102+ <string>#05000000</string>
103+ </dict>
104+ </dict>
105+ <dict>
106+ <key>name</key>
107+ <string>Variables</string>
108+ <key>scope</key>
109+ <string>variable</string>
110+ <key>settings</key>
111+ <dict>
112+ <key>foreground</key>
113+ <string>#00000000</string>
114+ </dict>
115+ </dict>
116+ <dict>
117+ <key>name</key>
118+ <string>Functions</string>
119+ <key>scope</key>
120+ <string>entity.name.function, meta.require, support.function.any-method</string>
121+ <key>settings</key>
122+ <dict>
123+ <key>foreground</key>
124+ <string>#04000000</string>
125+ </dict>
126+ </dict>
127+ <dict>
128+ <key>name</key>
129+ <string>Labels</string>
130+ <key>scope</key>
131+ <string>entity.name.label</string>
132+ <key>settings</key>
133+ <dict>
134+ <key>foreground</key>
135+ <string>#06000000</string>
136+ </dict>
137+ </dict>
138+ <dict>
139+ <key>name</key>
140+ <string>Classes</string>
141+ <key>scope</key>
142+ <string>support.class, entity.name.class, entity.name.type.class</string>
143+ <key>settings</key>
144+ <dict>
145+ <key>foreground</key>
146+ <string>#03000000</string>
147+ </dict>
148+ </dict>
149+ <dict>
150+ <key>name</key>
151+ <string>Classes</string>
152+ <key>scope</key>
153+ <string>meta.class</string>
154+ <key>settings</key>
155+ <dict>
156+ <key>foreground</key>
157+ <string>#00000000</string>
158+ </dict>
159+ </dict>
160+ <dict>
161+ <key>name</key>
162+ <string>Methods</string>
163+ <key>scope</key>
164+ <string>keyword.other.special-method</string>
165+ <key>settings</key>
166+ <dict>
167+ <key>foreground</key>
168+ <string>#04000000</string>
169+ </dict>
170+ </dict>
171+ <dict>
172+ <key>name</key>
173+ <string>Storage</string>
174+ <key>scope</key>
175+ <string>storage</string>
176+ <key>settings</key>
177+ <dict>
178+ <key>foreground</key>
179+ <string>#05000000</string>
180+ </dict>
181+ </dict>
182+ <dict>
183+ <key>name</key>
184+ <string>Support</string>
185+ <key>scope</key>
186+ <string>support.function</string>
187+ <key>settings</key>
188+ <dict>
189+ <key>foreground</key>
190+ <string>#06000000</string>
191+ </dict>
192+ </dict>
193+ <dict>
194+ <key>name</key>
195+ <string>Strings, Inherited Class</string>
196+ <key>scope</key>
197+ <string>string, constant.other.symbol, entity.other.inherited-class</string>
198+ <key>settings</key>
199+ <dict>
200+ <key>foreground</key>
201+ <string>#02000000</string>
202+ </dict>
203+ </dict>
204+ <dict>
205+ <key>name</key>
206+ <string>Integers</string>
207+ <key>scope</key>
208+ <string>constant.numeric</string>
209+ <key>settings</key>
210+ <dict>
211+ <key>foreground</key>
212+ <string>#03000000</string>
213+ </dict>
214+ </dict>
215+ <dict>
216+ <key>name</key>
217+ <string>Floats</string>
218+ <key>scope</key>
219+ <string>none</string>
220+ <key>settings</key>
221+ <dict>
222+ <key>foreground</key>
223+ <string>#03000000</string>
224+ </dict>
225+ </dict>
226+ <dict>
227+ <key>name</key>
228+ <string>Boolean</string>
229+ <key>scope</key>
230+ <string>none</string>
231+ <key>settings</key>
232+ <dict>
233+ <key>foreground</key>
234+ <string>#03000000</string>
235+ </dict>
236+ </dict>
237+ <dict>
238+ <key>name</key>
239+ <string>Constants</string>
240+ <key>scope</key>
241+ <string>constant</string>
242+ <key>settings</key>
243+ <dict>
244+ <key>foreground</key>
245+ <string>#03000000</string>
246+ </dict>
247+ </dict>
248+ <dict>
249+ <key>name</key>
250+ <string>Tags</string>
251+ <key>scope</key>
252+ <string>entity.name.tag</string>
253+ <key>settings</key>
254+ <dict>
255+ <key>foreground</key>
256+ <string>#01000000</string>
257+ </dict>
258+ </dict>
259+ <dict>
260+ <key>name</key>
261+ <string>Attributes</string>
262+ <key>scope</key>
263+ <string>entity.other.attribute-name</string>
264+ <key>settings</key>
265+ <dict>
266+ <key>foreground</key>
267+ <string>#03000000</string>
268+ </dict>
269+ </dict>
270+ <dict>
271+ <key>name</key>
272+ <string>Attribute IDs</string>
273+ <key>scope</key>
274+ <string>entity.other.attribute-name.id, punctuation.definition.entity</string>
275+ <key>settings</key>
276+ <dict>
277+ <key>foreground</key>
278+ <string>#04000000</string>
279+ </dict>
280+ </dict>
281+ <dict>
282+ <key>name</key>
283+ <string>Selector</string>
284+ <key>scope</key>
285+ <string>meta.selector</string>
286+ <key>settings</key>
287+ <dict>
288+ <key>foreground</key>
289+ <string>#05000000</string>
290+ </dict>
291+ </dict>
292+ <dict>
293+ <key>name</key>
294+ <string>Values</string>
295+ <key>scope</key>
296+ <string>none</string>
297+ <key>settings</key>
298+ <dict>
299+ <key>foreground</key>
300+ <string>#03000000</string>
301+ </dict>
302+ </dict>
303+ <dict>
304+ <key>name</key>
305+ <string>Headings</string>
306+ <key>scope</key>
307+ <string>markup.heading punctuation.definition.heading, entity.name.section</string>
308+ <key>settings</key>
309+ <dict>
310+ <key>fontStyle</key>
311+ <string></string>
312+ <key>foreground</key>
313+ <string>#04000000</string>
314+ </dict>
315+ </dict>
316+ <dict>
317+ <key>name</key>
318+ <string>Units</string>
319+ <key>scope</key>
320+ <string>keyword.other.unit</string>
321+ <key>settings</key>
322+ <dict>
323+ <key>foreground</key>
324+ <string>#03000000</string>
325+ </dict>
326+ </dict>
327+ <dict>
328+ <key>name</key>
329+ <string>Bold</string>
330+ <key>scope</key>
331+ <string>markup.bold, punctuation.definition.bold</string>
332+ <key>settings</key>
333+ <dict>
334+ <key>fontStyle</key>
335+ <string>bold</string>
336+ <key>foreground</key>
337+ <string>#03000000</string>
338+ </dict>
339+ </dict>
340+ <dict>
341+ <key>name</key>
342+ <string>Italic</string>
343+ <key>scope</key>
344+ <string>markup.italic, punctuation.definition.italic</string>
345+ <key>settings</key>
346+ <dict>
347+ <key>fontStyle</key>
348+ <string>italic</string>
349+ <key>foreground</key>
350+ <string>#05000000</string>
351+ </dict>
352+ </dict>
353+ <dict>
354+ <key>name</key>
355+ <string>Code</string>
356+ <key>scope</key>
357+ <string>markup.raw.inline</string>
358+ <key>settings</key>
359+ <dict>
360+ <key>foreground</key>
361+ <string>#02000000</string>
362+ </dict>
363+ </dict>
364+ <dict>
365+ <key>name</key>
366+ <string>Link Text</string>
367+ <key>scope</key>
368+ <string>string.other.link, punctuation.definition.string.end.markdown, punctuation.definition.string.begin.markdown</string>
369+ <key>settings</key>
370+ <dict>
371+ <key>foreground</key>
372+ <string>#01000000</string>
373+ </dict>
374+ </dict>
375+ <dict>
376+ <key>name</key>
377+ <string>Link Url</string>
378+ <key>scope</key>
379+ <string>meta.link</string>
380+ <key>settings</key>
381+ <dict>
382+ <key>foreground</key>
383+ <string>#03000000</string>
384+ </dict>
385+ </dict>
386+ <dict>
387+ <key>name</key>
388+ <string>Quotes</string>
389+ <key>scope</key>
390+ <string>markup.quote</string>
391+ <key>settings</key>
392+ <dict>
393+ <key>foreground</key>
394+ <string>#03000000</string>
395+ </dict>
396+ </dict>
397+ <dict>
398+ <key>name</key>
399+ <string>Inserted</string>
400+ <key>scope</key>
401+ <string>markup.inserted</string>
402+ <key>settings</key>
403+ <dict>
404+ <key>foreground</key>
405+ <string>#02000000</string>
406+ </dict>
407+ </dict>
408+ <dict>
409+ <key>name</key>
410+ <string>Deleted</string>
411+ <key>scope</key>
412+ <string>markup.deleted</string>
413+ <key>settings</key>
414+ <dict>
415+ <key>foreground</key>
416+ <string>#01000000</string>
417+ </dict>
418+ </dict>
419+ <dict>
420+ <key>name</key>
421+ <string>Changed</string>
422+ <key>scope</key>
423+ <string>markup.changed</string>
424+ <key>settings</key>
425+ <dict>
426+ <key>foreground</key>
427+ <string>#05000000</string>
428+ </dict>
429+ </dict>
430+ <dict>
431+ <key>name</key>
432+ <string>Colors</string>
433+ <key>scope</key>
434+ <string>constant.other.color</string>
435+ <key>settings</key>
436+ <dict>
437+ <key>foreground</key>
438+ <string>#06000000</string>
439+ </dict>
440+ </dict>
441+ <dict>
442+ <key>name</key>
443+ <string>Regular Expressions</string>
444+ <key>scope</key>
445+ <string>string.regexp</string>
446+ <key>settings</key>
447+ <dict>
448+ <key>foreground</key>
449+ <string>#06000000</string>
450+ </dict>
451+ </dict>
452+ <dict>
453+ <key>name</key>
454+ <string>Escape Characters</string>
455+ <key>scope</key>
456+ <string>constant.character.escape</string>
457+ <key>settings</key>
458+ <dict>
459+ <key>foreground</key>
460+ <string>#06000000</string>
461+ </dict>
462+ </dict>
463+ <dict>
464+ <key>name</key>
465+ <string>Embedded</string>
466+ <key>scope</key>
467+ <string>punctuation.section.embedded, variable.interpolation</string>
468+ <key>settings</key>
469+ <dict>
470+ <key>foreground</key>
471+ <string>#05000000</string>
472+ </dict>
473+ </dict>
474+ <dict>
475+ <key>name</key>
476+ <string>Illegal</string>
477+ <key>scope</key>
478+ <string>invalid.illegal</string>
479+ <key>settings</key>
480+ <dict>
481+ <key>background</key>
482+ <string>#01000000</string>
483+ <key>foreground</key>
484+ <string>#00000000</string>
485+ </dict>
486+ </dict>
487+ <dict>
488+ <key>name</key>
489+ <string>Broken</string>
490+ <key>scope</key>
491+ <string>invalid.broken</string>
492+ <key>settings</key>
493+ <dict>
494+ <key>background</key>
495+ <string>#03000000</string>
496+ <key>foreground</key>
497+ <string>#07000000</string>
498+ </dict>
499+ </dict>
500+ </array>
501+ <key>uuid</key>
502+ <string>uuid</string>
503+ </dict>
504+</plist>
assets/themes/dracula-sublime+1−1

Submodule changed.

assets/themes/gruvbox+1−1

Submodule changed.

assets/themes/onehalf+1−1

Submodule changed.

assets/themes/visual-studio-dark-plusdeleted−1

Submodule changed.

assets/themes/zenburn+1−1

Submodule changed.

build.rs−10
@@ -54,21 +54,11 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
54 "assets/manual/bat.1.in",
54 "assets/manual/bat.1.in",
55 out_dir.join("assets/manual/bat.1"),
55 out_dir.join("assets/manual/bat.1"),
56 )?;
56 )?;
57− template(
58− &variables,
59− "assets/completions/bat.bash.in",
60− out_dir.join("assets/completions/bat.bash"),
61− )?;
62 template(
57 template(
63 &variables,
58 &variables,
64 "assets/completions/bat.fish.in",
59 "assets/completions/bat.fish.in",
65 out_dir.join("assets/completions/bat.fish"),
60 out_dir.join("assets/completions/bat.fish"),
66 )?;
61 )?;
67− template(
68− &variables,
69− "assets/completions/_bat.ps1.in",
70− out_dir.join("assets/completions/_bat.ps1"),
71− )?;
72 template(
62 template(
73 &variables,
63 &variables,
74 "assets/completions/bat.zsh.in",
64 "assets/completions/bat.zsh.in",
diagnostics/info.sh+4−6
@@ -58,8 +58,7 @@ _bat_:run() {
58 _out "$BAT" --version
58 _out "$BAT" --version
59 _out env | grep '^BAT_\|^PAGER='
59 _out env | grep '^BAT_\|^PAGER='
60
60
61− local cache_dir
61+ local cache_dir="$($BAT --cache-dir)"
62− cache_dir="$($BAT --cache-dir)"
63 if [[ -f "${cache_dir}/syntaxes.bin" ]]; then
62 if [[ -f "${cache_dir}/syntaxes.bin" ]]; then
64 _print_command "$BAT" "--list-languages"
63 _print_command "$BAT" "--list-languages"
65 echo "Found custom syntax set."
64 echo "Found custom syntax set."
@@ -80,8 +79,8 @@ _bat_config_:run() {
80_bat_wrapper_:run() {
79_bat_wrapper_:run() {
81 _bat_wrapper_:detect_wrapper() {
80 _bat_wrapper_:detect_wrapper() {
82 local bat="$1"
81 local bat="$1"
83− if file "$(command -v "${bat}")" | grep "text executable" &> /dev/null; then
82+ if file "$(which "${bat}")" | grep "text executable" &> /dev/null; then
84− _out_fence cat "$(command -v "${bat}")"
83+ _out_fence cat "$(which "${bat}")"
85 return
84 return
86 fi
85 fi
87
86
@@ -105,8 +104,7 @@ _bat_wrapper_function_:run() {
105 fi ;;
104 fi ;;
106
105
107 *bash* | *zsh*)
106 *bash* | *zsh*)
108− local type
107+ local type="$("$SHELL" --login -i -c "type ${command}" 2>&1)"
109− type="$("$SHELL" --login -i -c "type ${command}" 2>&1)"
110 if grep 'function' <<< "$type" &> /dev/null; then
108 if grep 'function' <<< "$type" &> /dev/null; then
111 _out_fence "$SHELL" --login -i -c "declare -f ${command}"
109 _out_fence "$SHELL" --login -i -c "declare -f ${command}"
112 return
110 return
doc/README-ja.md+10−24
@@ -1,6 +1,7 @@
1<p align="center">
1<p align="center">
2 <img src="logo-header.svg" alt="bat - a cat clone with wings"><br>
2 <img src="logo-header.svg" alt="bat - a cat clone with wings"><br>
3− <a href="https://github.com/sharkdp/bat/actions?query=workflow%3ACICD"><img src="https://github.com/sharkdp/bat/workflows/CICD/badge.svg" alt="Build Status"></a>
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?svg=true"></a>
4 <img src="https://img.shields.io/crates/l/bat.svg" alt="license">
5 <img src="https://img.shields.io/crates/l/bat.svg" alt="license">
5 <a href="https://crates.io/crates/bat"><img src="https://img.shields.io/crates/v/bat.svg?colorB=319e8c" alt="Version info"></a><br>
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>
6 シンタックスハイライトとGitとの連携機能付きの <i>cat(1)</i> クローン。
7 シンタックスハイライトとGitとの連携機能付きの <i>cat(1)</i> クローン。
@@ -11,12 +12,8 @@
11 <a href="#使い方">使い方</a> •
12 <a href="#使い方">使い方</a> •
12 <a href="#インストール">インストール</a> •
13 <a href="#インストール">インストール</a> •
13 <a href="#カスタマイズ">カスタマイズ</a> •
14 <a href="#カスタマイズ">カスタマイズ</a> •
14− <a href="#プロジェクトの目標と既存の類似したOSS">プロジェクトの目標と既存の類似したOSS</a><br>
15+ <a href="#プロジェクトの目標と既存の類似したOSS">プロジェクトの目標と既存の類似したOSS</a> •
15− [<a href="../README.md">English</a>]
16+ 翻訳 [<a href="https://github.com/chinanf-boy/bat-zh">中文</a>][<a href="README-ja.md">日本語</a>][<a href="README-ko.md">한국어</a>]
16− [<a href="README-zh.md">中文</a>]
17− [日本語]
18− [<a href="README-ko.md">한국어</a>]
19− [<a href="README-ru.md">Русский</a>]
20</p>
17</p>
21
18
22### シンタックスハイライト
19### シンタックスハイライト
@@ -98,17 +95,6 @@ bat f - g # output 'f', then stdin, then 'g'.
98
95
99### 他のツールとの統合
96### 他のツールとの統合
100
97
101−#### `fzf`
102−
103−[`fzf`](https://github.com/junegunn/fzf) のプレビューウィンドウに `bat` を使用できます。
104−その場合、`bat` の `--color=always` オプションを用いてカラー出力を強制しなければなりません。
105−また、`--line-range` オプションを用いることで巨大なファイルの読み込み時間を制限できます:
106−```bash
107−fzf --preview 'bat --color=always --style=numbers --line-range=:500 {}'
108−```
109−
110−詳しくは [`fzf` の `README`](https://github.com/junegunn/fzf#preview-window) を参照してください。
111−
112#### `find` or `fd`
98#### `find` or `fd`
113
99
114`find` の `-exec` オプションを使用して、`bat` ですべての検索結果をプレビューできます:
100`find` の `-exec` オプションを使用して、`bat` ですべての検索結果をプレビューできます:
@@ -181,7 +167,7 @@ man 2 select
181
167
182## インストール
168## インストール
183
169
184−[![Packaging status](https://repology.org/badge/vertical-allrepos/bat-cat.svg)](https://repology.org/project/bat-cat/versions)
170+[![Packaging status](https://repology.org/badge/vertical-allrepos/bat.svg)](https://repology.org/project/bat/versions)
185
171
186### On Ubuntu (`apt` を使用)
172### On Ubuntu (`apt` を使用)
187*... や他のDebianベースのLinuxディストリビューション*
173*... や他のDebianベースのLinuxディストリビューション*
@@ -205,7 +191,7 @@ ln -s /usr/bin/batcat ~/.local/bin/bat
205batの最新リリースを実行する場合、または Ubuntu/Debian の古いバージョンを使用している場合は、[release page](https://github.com/sharkdp/bat/releases) から最新の `.deb` パッケージをダウンロードし、
191batの最新リリースを実行する場合、または Ubuntu/Debian の古いバージョンを使用している場合は、[release page](https://github.com/sharkdp/bat/releases) から最新の `.deb` パッケージをダウンロードし、
206次の方法でインストールします:
192次の方法でインストールします:
207```bash
193```bash
208−sudo dpkg -i bat_0.18.3_amd64.deb # adapt version number and architecture
194+sudo dpkg -i bat_0.16.0_amd64.deb # adapt version number and architecture
209```
195```
210
196
211### On Alpine Linux
197### On Alpine Linux
@@ -366,7 +352,7 @@ ansible-galaxy install aeimer.install_bat
366### From source
352### From source
367
353
368
354
369−`bat` をソースからビルドしたいならば、Rust 1.51 以上の環境が必要です。
355+`bat` をソースからビルドしたいならば、Rust 1.36 以上の環境が必要です。
370`cargo` を使用してビルドすることができます:
356`cargo` を使用してビルドすることができます:
371
357
372```bash
358```bash
@@ -407,7 +393,7 @@ bat --list-themes | fzf --preview="bat --theme={} --color=always /path/to/file"
407
393
408### 新しい構文の追加 / 言語の定義
394### 新しい構文の追加 / 言語の定義
409
395
410−`bat` はシンタックスハイライトのための [`syntect`](https://github.com/trishume/syntect/)
396+`bat` はシンタックスハイライトのための [`syntext`](https://github.com/trishume/syntect/)
411という素晴らしいライブラリを使用しています。`syntect` は、
397という素晴らしいライブラリを使用しています。`syntect` は、
412[Sublime Text の `.sublime-syntax` ファイル](https://www.sublimetext.com/docs/3/syntax.html)
398[Sublime Text の `.sublime-syntax` ファイル](https://www.sublimetext.com/docs/3/syntax.html)
413とテーマを読み取ることができます。新しい構文を定義するために以下の手順を行います。
399とテーマを読み取ることができます。新しい構文を定義するために以下の手順を行います。
@@ -525,7 +511,7 @@ export BAT_CONFIG_PATH="/path/to/bat.conf"
525# Use italic text on the terminal (not supported on all terminals)
511# Use italic text on the terminal (not supported on all terminals)
526--italic-text=always
512--italic-text=always
527
513
528−# Use C++ syntax for Arduino .ino files
514+# Use C++ syntax for .ino files
529--map-syntax "*.ino:C++"
515--map-syntax "*.ino:C++"
530
516
531# Use ".gitignore"-style highlighting for ".ignore" files
517# Use ".gitignore"-style highlighting for ".ignore" files
@@ -644,7 +630,7 @@ cargo install --locked --force
644比較については [このドキュメント](alternatives.md) を参照してください。
630比較については [このドキュメント](alternatives.md) を参照してください。
645
631
646## ライセンス
632## ライセンス
647−Copyright (c) 2018-2021 [bat-developers](https://github.com/sharkdp/bat).
633+Copyright (c) 2018-2020 [bat-developers](https://github.com/sharkdp/bat).
648
634
649`bat` は MIT License 及び Apache License 2.0 の両方の条件の下で配布されています。
635`bat` は MIT License 及び Apache License 2.0 の両方の条件の下で配布されています。
650
636
doc/README-ko.md+191−466
@@ -1,90 +1,75 @@
1<p align="center">
1<p align="center">
2− <img src="logo-header.svg" alt="bat - a cat clone with wings"><br>
2+ <img src="../doc/logo-header.svg" alt="bat - a cat clone with wings"><br>
3− <a href="https://github.com/sharkdp/bat/actions?query=workflow%3ACICD"><img src="https://github.com/sharkdp/bat/workflows/CICD/badge.svg" alt="Build Status"></a>
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>
4 <img src="https://img.shields.io/crates/l/bat.svg" alt="license">
5 <img src="https://img.shields.io/crates/l/bat.svg" alt="license">
5 <a href="https://crates.io/crates/bat"><img src="https://img.shields.io/crates/v/bat.svg?colorB=319e8c" alt="Version info"></a><br>
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>
6− 문법 강조와 Git 통합 기능의 <i>cat(1)</i> 클론
7+
8+ 문법 강조와 깃 통합 기능의 <i>cat(1)</i> 클론
7</p>
9</p>
8
10
9<p align="center">
11<p align="center">
10 <a href="#문법-강조">주요 기능들</a> •
12 <a href="#문법-강조">주요 기능들</a> •
11 <a href="#사용법">사용법</a> •
13 <a href="#사용법">사용법</a> •
12 <a href="#설치">설치</a> •
14 <a href="#설치">설치</a> •
13− <a href="#사용자화">사용자화</a> •
15+ <a href="#커스터마이즈">커스터마이즈</a> •
14− <a href="#프로젝트-목표와-대안들">프로젝트 목표와 대안들</a><br>
16+ <a href="#프로젝트-목표와-대안들">프로젝트 목표와 대안들</a> •
15− [<a href="../README.md">English</a>]
17+ 번역 [<a href="https://github.com/chinanf-boy/bat-zh">中文</a>][<a href="../doc/README-ja.md">日本語</a>]
16− [<a href="README-zh.md">中文</a>]
17− [<a href="README-ja.md">日本語</a>]
18− [한국어]
19− [<a href="README-ru.md">Русский</a>]
20</p>
18</p>
21
19
22### 문법 강조
20### 문법 강조
23
21
24−`bat`은 다양한 프로그래밍 및 마크업 언어의 문법 강조(syntax highlighting) 기능을
22+`bat`은 다양한 프로그래밍 언어와 마크업 언어에 대해 문법 강조(Syntax highlighting)기능을 지원하고 있습니다:
25−지원합니다:
26
23
27![Syntax highlighting example](https://imgur.com/rGsdnDe.png)
24![Syntax highlighting example](https://imgur.com/rGsdnDe.png)
28
25
29### Git 통합
26### Git 통합
30
27
31−`bat`은 `git`을 통해 인덱스와 함께 변경분을 표시합니다
28+`bat`은 `git`을 통해 인덱스와 함께 변경분을 표시합니다 (왼쪽 바를 확인하세요):
32−(왼쪽 사이드바를 확인하세요):
33
29
34![Git integration example](https://i.imgur.com/2lSW4RE.png)
30![Git integration example](https://i.imgur.com/2lSW4RE.png)
35
31
36−### 비인쇄 문자 처리
32+### 표시할 수 없는 문자 처리
37
33
38−`-A`/`--show-all` 옵션을 사용하여 비인쇄 문자를 표시 및 강조할 수 있습니다:
34+`-A`/`--show-all` 옵션을 사용하여 표시할수 없는 문자를 시각화 해줍니다:
39
35
40![Non-printable character example](https://i.imgur.com/WndGp9H.png)
36![Non-printable character example](https://i.imgur.com/WndGp9H.png)
41
37
42−### 자동 페이징
38+### 자동 페이징
43
39
44−`bat`은 기본적으로 한 화면에 비해 출력이 큰 경우 `less`와 같은 페이저(pager)로
40+하나의 화면에 비해 출력이 너무 큰 경우, `less` 를 이용해 출력들을 연결할 수 있습니다.
45−출력을 연결(pipe)합니다.
46−만약 `bat`을 언제나 `cat`처럼 작동하게 하려면 (출력을 페이지하지 않기),
47−`--paging=never` 옵션을 커맨드 라인이나 설정 파일에 넣을 수 있습니다.
48−셸(shell) 설정에서 `cat`을 `bat`의 alias로 사용하려면,
49−`alias cat='bat --paging=never'`를 써서 기본 행동을 유지할 수 있습니다.
50
41
51−### 파일 연결(concatenation)
42+### 파일 연결
52
43
53−페이저(pager)를 사용하더라도 `bat`은 파일들을 연결(concatenate)할 수 있습니다
44+이 뿐만 아니라 파일을 연결할 때도 사용 할 수 있습니다. :wink: `bat`가 인터렉티브 하지 않은(non-interactive)가 감지하면 (예를 들어,다른 프로세스 혹은 파일과 파이프라인을 연결 한 경우) `bat`은 `cat`을 대신하여 동작하며 일반 파일 내용을 표기해줍니다.
54−:wink:.
55−`bat`이 비대화형(non-interactive) 터미널(예를 들어, 다른 프로세스나 파일에
56−연결(pipe)한 경우)을 감지하면, `bat`은 `--pager` 옵션의 값과 상관없이 `cat`과
57−동일하게 파일 내용을 그대로 출력합니다.
58
45
59## 사용법
46## 사용법
60
47
61−터미널에 하나의 파일 표시하기
48+터미널에서 하나의 파일 표시하기
62
49
63```bash
50```bash
64> bat README.md
51> bat README.md
65```
52```
66
53
67−여러 파일 한 번에 보여주기
54+여러 파일 한번에 보여주기
68
55
69```bash
56```bash
70> bat src/*.rs
57> bat src/*.rs
71```
58```
72
59
73−stdin에서 읽고, 자동으로 맞는 문법 결정하기 (참고로, 문법 강조는 파일의 첫
60+stdin에서 읽고, 자동으로 맞는 문법 강조 적용하기
74−줄만으로 문법이 결정될 수 있을 때만 작동합니다.
75−이는 보통 `#!/bin/sh`와 같은 셔뱅(shebang)으로 판단합니다.)
76
61
77```bash
62```bash
78> curl -s https://sh.rustup.rs | bat
63> curl -s https://sh.rustup.rs | bat
79```
64```
80
65
81−stdin에서 읽고, 명시적으로 언어 지정하기
66+stdin에서 읽고, 명시적으로 언어 지정하여 적용하기
82
67
83```bash
68```bash
84> yaml2json .travis.yml | json_pp | bat -l json
69> yaml2json .travis.yml | json_pp | bat -l json
85```
70```
86
71
87−비인쇄 문자 표시 및 강조하기
72+표시할 수 없는 문자 처리하기
88```bash
73```bash
89> bat -A /etc/hosts
74> bat -A /etc/hosts
90```
75```
@@ -101,38 +86,23 @@ bat -n main.rs # show line numbers (only)
101bat f - g # output 'f', then stdin, then 'g'.
86bat f - g # output 'f', then stdin, then 'g'.
102```
87```
103
88
104−### 다른 도구들과 통합하기
89+### 다른 툴과의 통합
105−
106−#### `fzf`
107−
108−`bat`을 [`fzf`](https://github.com/junegunn/fzf)의 프리뷰로 쓸 수 있습니다.
109−이를 위해서는 `bat`의 `--color=always` 옵션으로 항상 컬러 출력이 나오게 해야
110−합니다.
111−또한 `--line-range` 옵션으로 긴 파일의 로드 시간을 제한할 수 있습니다:
112−```bash
113−fzf --preview 'bat --color=always --style=numbers --line-range=:500 {}'
114−```
115−더 많은 정보는
116−[`fzf`의 `README`](https://github.com/junegunn/fzf#preview-window)를 참고하세요.
117
90
118−#### `find`와 `fd`
91+#### `find` 와 `fd`
119
92
120−`find`의 `-exec` 옵션을 사용하여 모든 검색 결과를 `bat`로 미리 볼 수 있습니다:
93+`find`의 `-exec` 옵션을 사용하여 `bat`의 모든 검색 결과를 미리 볼 수 있습니다:
121```bash
94```bash
122find … -exec bat {} +
95find … -exec bat {} +
123```
96```
124
97
125−[`fd`](https://github.com/sharkdp/fd)를 사용하는 경우, `-X`/`--exec-batch`
98+[`fd`](https://github.com/sharkdp/fd)를 사용하고 있는 경우, `-X`/`--exec-batch` 옵션을 이용하여 동일하게 사용할 수 있습니다:
126−옵션을 이용하여 동일하게 사용할 수 있습니다:
127```bash
99```bash
128fd … -X bat
100fd … -X bat
129```
101```
130
102
131#### `ripgrep`
103#### `ripgrep`
132
104
133−[`batgrep`](https://github.com/eth-p/bat-extras/blob/master/doc/batgrep.md)을
105+[`batgrep`](https://github.com/eth-p/bat-extras/blob/master/doc/batgrep.md)과 함께, [`ripgrep`](https://github.com/BurntSushi/ripgrep)의 검색 결과를 `bat`을 이용하여 볼 수 있습니다.
134−통해 `bat`로 [`ripgrep`](https://github.com/BurntSushi/ripgrep)의 검색 결과를
135−출력할 수 있습니다.
136
106
137```bash
107```bash
138batgrep needle src/
108batgrep needle src/
@@ -140,401 +110,279 @@ batgrep needle src/
140
110
141#### `tail -f`
111#### `tail -f`
142
112
143−`bat`와 `tail -f`를 함께 사용하여 주어진 파일을 문법 강조하며 지속적으로
113+`bat` 과 `tail -f`를 함께 사용하여, 특정 파일을 문법 강조하며 지속적으로 모니터링 할 수 있습니다.
144−모니터할 수 있습니다.
145```bash
114```bash
146tail -f /var/log/pacman.log | bat --paging=never -l log
115tail -f /var/log/pacman.log | bat --paging=never -l log
147```
116```
148−참고로 이 작업을 하려면 페이징 기능을 꺼야 합니다.
117+이 작업을 하려면 페이징 기능을 꺼야합니다. 또, 자동 감지가 되지 않기 때문에, 적용되어야할 문법을 명시적(`-l log`)으로 지정해야 합니다.
149−또한 이 경우 문법을 자동 감지할 수 없기 때문에, 적용할 문법을 직접 지정해야
150−합니다 (`-l log`).
151
118
152#### `git`
119#### `git`
153
120
154−`bat`과 `git show`를 함께 사용하여 주어진 파일의 이전 버전을 올바른 문법 강조로
121+`bat`과 `git show`를 함께 사용하여 주어진 파일의 이전 기록을 문법 강조와 함께 볼 수 있습니다:
155−볼 수 있습니다:
156```bash
122```bash
157git show v0.6.0:src/main.rs | bat -l rs
123git show v0.6.0:src/main.rs | bat -l rs
158```
124```
159
125
160−#### `git diff`
126+diffs 내에서 문법 강조 표시는 현재 지원되지 않습니다. 이 기능은 [`delta`](https://github.com/dandavison/delta)에서 찾아 볼 수 있습니다.
161−
162−`bat`과 `git diff`를 함께 사용하여 수정된 코드 주위의 줄들을 올바른 문법 강조로
163−볼 수 있습니다:
164−```bash
165−batdiff() {
166− git diff --name-only --diff-filter=d | xargs bat --diff
167−}
168−```
169−이것을 별도의 도구로 쓰고 싶다면
170−[`bat-extras`](https://github.com/eth-p/bat-extras)의 `batdiff`를 확인해 보세요.
171−
172−Git과 diff의 더 많은 지원을 원한다면
173−[`delta`](https://github.com/dandavison/delta)를 확인해 보세요.
174
127
175#### `xclip`
128#### `xclip`
176
129
177−`bat` 출력에 줄 번호와 Git 수정 내역이 포함되어서 파일의 내용을 복사하기
130+`bat` 출력에서 라인 넘버와 Git 수정 내역이 같이 있어 파일 내용을 복사하기가 어려울 수도 있습니다. 이 경우에는 `-p`/`--plain` 옵션을 사용 하거나 출력 시 파이프라인으로 `xclip`을 사용하면 됩니다:
178−어려울 수 있습니다.
179−이 경우에는 `bat`의 `-p`/`--plain` 옵션을 사용하거나 간단히 `xclip`으로 출력을
180−연결(pipe)하면 됩니다:
181```bash
131```bash
182bat main.cpp | xclip
132bat main.cpp | xclip
183```
133```
184−`bat`는 출력이 우회되고 있다는 것을 감지하여 파일 내용 그대로를 출력합니다.
134+`bat` 에서는 리다이렉트된 것으로 감지하여, 파일 내용만 출력합니다.
185
135
186#### `man`
136#### `man`
187
137
188−`MANPAGER` 환경 변수 설정을 통해 `bat`을 `man`의 컬러 페이저(pager)로 쓸 수
138+`bat`은 `MANPAGER` 환경 변수 설정을 통해 `man`에 대하여 컬러 페이져를 사용할 수 있습니다:
189−있습니다.
190
139
191```bash
140```bash
192export MANPAGER="sh -c 'col -bx | bat -l man -p'"
141export MANPAGER="sh -c 'col -bx | bat -l man -p'"
193man 2 select
142man 2 select
194```
143```
195−(Debian이나 Ubuntu를 사용한다면 `bat`을 `batcat`으로 치환하세요.)
196
144
197−포팻 문제가 발생한다면, `MANROFFOPT="-c"`을 써야 할 수 있습니다.
145+포매팅 문제가 발생한다면, `MANROFFOPT="-c"` 설정 해야 할 수도 있습니다 .
198
146
199−이 기능을 포함한 새로운 명령어를 선호한다면,
147+새 커맨드에서 이 번들을 사용하려면, [`batman`](https://github.com/eth-p/bat-extras/blob/master/doc/batman.md)을 이용 할 수 있습니다.
200−[`batman`](https://github.com/eth-p/bat-extras/blob/master/doc/batman.md)을 쓸
201−수도 있습니다.
202
148
203−참고로 [Manpage 문법](../assets/syntaxes/Manpage.sublime-syntax)은 본 저장소에서
204−개발 중에 있으며, 아직 더 손봐야 합니다.
205
149
206−또한, 이는 Mandoc의 `man` 구현에서
150+참고 : [Manpage syntax](../assets/syntaxes/Manpage.sublime-syntax)는 이 저장소에서 개발되고 있으며, 아직 작업 중 입니다.
207−[작동하지 않습니다](https://github.com/sharkdp/bat/issues/1145).
208
151
209#### `prettier` / `shfmt` / `rustfmt`
152#### `prettier` / `shfmt` / `rustfmt`
210
153
211−[`prettybat`](https://github.com/eth-p/bat-extras/blob/master/doc/prettybat.md)
154+[`prettybat`](https://github.com/eth-p/bat-extras/blob/master/doc/prettybat.md) 스크립트는 코드를 포맷팅하고 `bat`으로 출력해주는 랩퍼(wrapper) 입니다.
212−스크립트는 코드를 포맷하고 `bat`으로 출력하는 래퍼(wrapper)입니다.
213
155
214
156
215## 설치
157## 설치
216
158
217−[![Packaging status](https://repology.org/badge/vertical-allrepos/bat-cat.svg)](https://repology.org/project/bat-cat/versions)
159+[![Packaging status](https://repology.org/badge/vertical-allrepos/bat.svg)](https://repology.org/project/bat/versions)
218
160
219−### Ubuntu에서 (`apt` 사용)
161+### On Ubuntu
220−*... 그리고 다른 Debian 기반의 Linux 배포판들에서.*
162+*... 그리고 기타 Debian 기반의 Linux 배포판들.*
221
163
222−`bat`은 [Ubuntu](https://packages.ubuntu.com/eoan/bat)와
164+Ubuntu Eoan 19.10 혹은 Debian unstable sid 이후 버전 부터는 [Ubuntu용 `bat` 패키지](https://packages.ubuntu.com/eoan/bat)나 [Debian용 `bat` 패키지](https://packages.debian.org/sid/bat) 를 설치 할 수 있습니다.
223−[Debian](https://packages.debian.org/sid/bat) 패키지 배포 과정에 도입되는 중이며,
224−Eoan 19.10 버전의 Ubuntu에서부터 제공됩니다.
225−현재 Debian에서는 불안정한 "Sid" 브랜치에서만 `bat`이 제공됩니다.
226−
227−만약 충분히 최신 버전의 Ubuntu/Debian이 설치되어 있다면 간단히 다음을 실행하세요:
228
165
229```bash
166```bash
230apt install bat
167apt install bat
231```
168```
232
169
233−**중요**: 만약 `bat`을 이와 같이 설치한다면, ([다른 패키지와의 이름
170+만약 최근 릴리즈된 bat을 사용을 원하거나 buntu/Debian 예전 버전을 사용하는 경우, [릴리즈 페이지](https://github.com/sharkdp/bat/releases)에서 다음과 같이 `.deb` 패키지를 받아 설치 할 수도 있습니다:
234−충돌](https://github.com/sharkdp/bat/issues/982)로 인하여) `bat` 대신에
235−`batcat`이라는 이름의 실행 파일로 설치될 수 있음을 참고하세요.
236−이에 따른 문제들과 다른 배포판들과의 일관성을 위하여 `bat -> batcat` symlink
237−혹은 alias를 설정할 수 있습니다:
238−``` bash
239−mkdir -p ~/.local/bin
240−ln -s /usr/bin/batcat ~/.local/bin/bat
241−```
242−
243−### Ubuntu에서 (가장 최신 `.deb` 패키지들 사용)
244−*... 그리고 다른 Debian 기반의 Linux 배포판들에서.*
245−
246−만약 여러분이 설치한 Ubuntu/Debian에 패키지가 배포되지 않거나 가장 최신 릴리즈된
247−`bat`을 원한다면, [릴리즈 페이지](https://github.com/sharkdp/bat/releases)에서
248−다음과 같이 `.deb` 패키지를 받아 설치하세요:
249
171
250```bash
172```bash
251−sudo dpkg -i bat_0.18.3_amd64.deb # adapt version number and architecture
173+sudo dpkg -i bat_0.16.0_amd64.deb # adapt version number and architecture
252```
174```
253
175
254−### Alpine Linux에서
176+### On Alpine Linux
255
177
256−적절한 저장소가 활성화되어 있다면, 공식 소스를 통해
178+공식 소스를 통해 [`bat` 패키지](https://pkgs.alpinelinux.org/packages?name=bat) 를 설치 할 수 있습니다:
257−[`bat` 패키지](https://pkgs.alpinelinux.org/packages?name=bat)를 설치할 수
258−있습니다:
259
179
260```bash
180```bash
261apk add bat
181apk add bat
262```
182```
263
183
264−### Arch Linux에서
184+### On Arch Linux
265
185
266−공식 소스를 통해
186+공식 소스를 통해 [`bat` 패키지](https://www.archlinux.org/packages/community/x86_64/bat/)를 설치할 수 있습니다:
267−[`bat` 패키지](https://www.archlinux.org/packages/community/x86_64/bat/)를
268−설치할 수 있습니다:
269
187
270```bash
188```bash
271pacman -S bat
189pacman -S bat
272```
190```
273
191
274−### Fedora에서
192+### On Fedora
275
193
276−공식
194+[공식 Fedora 모듈 저장소](https://docs.fedoraproject.org/en-US/modularity/using-modules/)에서 [`bat` 패키지](https://koji.fedoraproject.org/koji/packageinfo?packageID=27506)을 설치할 수 있습니다:
277−[Fedora 모듈](https://docs.fedoraproject.org/en-US/modularity/using-modules/)
278−저장소에서
279−[`bat` 패키지](https://koji.fedoraproject.org/koji/packageinfo?packageID=27506)를
280−설치할 수 있습니다:
281
195
282```bash
196```bash
283dnf install bat
197dnf install bat
284```
198```
285
199
286−### Funtoo Linux에서
200+### On Gentoo Linux
287−
288−dev-kit을 통해 [`bat` 패키지](https://github.com/funtoo/dev-kit/tree/1.4-release/sys-apps/bat)를 설치할 수 있습니다:
289−
290−```bash
291−emerge sys-apps/bat
292−```
293−
294−### Gentoo Linux에서
295
201
296−공식 소스를 통해
202+공식 소스를 통해 [`bat` 패키지](https://packages.gentoo.org/packages/sys-apps/bat)를 설치할 수 있습니다.
297−[`bat` 패키지](https://packages.gentoo.org/packages/sys-apps/bat)를 설치할 수
298−있습니다:
299
203
300```bash
204```bash
301emerge sys-apps/bat
205emerge sys-apps/bat
302```
206```
303
207
304−### Void Linux에서
208+### On Void Linux
305
209
306−xbps-install을 이용해 `bat`을 설치할 수 있습니다:
210+xbps-install를 이용해 `bat`을 설치할 수 있습니다:
307```bash
211```bash
308xbps-install -S bat
212xbps-install -S bat
309```
213```
310
214
311−### Termux에서
215+### On FreeBSD
312−
313−pkg를 이용해 `bat`을 설치할 수 있습니다:
314−```bash
315−pkg install bat
316−```
317−
318−### FreeBSD에서
319
216
320−pkg를 이용하여 미리 컴파일된
217+pkg를 이용하여 미리 컴파일된 [`bat` 패키지](https://www.freshports.org/textproc/bat)를 설치할 수 있습니다:
321−[`bat` 패키지](https://www.freshports.org/textproc/bat)를 설치할 수 있습니다:
322
218
323```bash
219```bash
324pkg install bat
220pkg install bat
325```
221```
326
222
327−또는 FreeBSD 포트에서 직접 빌드할 수도 있습니다:
223+또는 FreeBSD 포트에서 직접 빌드할 수도 있습니다:
328
224
329```bash
225```bash
330cd /usr/ports/textproc/bat
226cd /usr/ports/textproc/bat
331make install
227make install
332```
228```
333
229
334−### nix를 써서
230+### Via nix
335
231
336−[nix package manager](https://nixos.org/nix)를 이용해 `bat`을 설치할 수
232+[nix package manager](https://nixos.org/nix)를 이용해 `bat`을 설치할 수 있습니다:
337−있습니다:
338
233
339```bash
234```bash
340nix-env -i bat
235nix-env -i bat
341```
236```
342
237
343−### openSUSE에서
238+### On openSUSE
344
239
345−zypper를 이용해 `bat`을 설치할 수 있습니다:
240+zypper을 이용해 `bat`을 설치할 수 있습니다:
346
241
347```bash
242```bash
348zypper install bat
243zypper install bat
349```
244```
350
245
351−### snap 패키지를 써서
246+### On macOS
352−
353−지금으로서는 추천하는 snap 패키지가 없습니다.
354−제공되는 패키지들이 존재할 수는 있지만, 공식적으로 지원되지 않으며
355−[문제](https://github.com/sharkdp/bat/issues/1519)가 있을 수 있습니다.
356−
357
247
358−### macOS (또는 Linux)에서 Homebrew를 써서
248+[Homebrew](http://braumeister.org/formula/bat)를 이용해 `bat`을 설치할 수 있습니다:
359−
360−[macOS의 Homebrew](https://formulae.brew.sh/formula/bat) 또는
361−[Linux의 Homebrew](https://formulae.brew.sh/formula-linux/bat)를 이용하여
362−`bat`을 설치할 수 있습니다.
363
249
364```bash
250```bash
365brew install bat
251brew install bat
366```
252```
367
253
368−### macOS에서 MacPorts를 써서
254+또는 [MacPorts](https://ports.macports.org/port/bat/summary)를 사용할 수도 있습니다:
369−
370−[MacPorts](https://ports.macports.org/port/bat/summary)를 이용하여 `bat`을
371−설치할 수 있습니다:
372
255
373```bash
256```bash
374port install bat
257port install bat
375```
258```
376
259
377−### Windows에서
260+### On Windows
378
261
379−Windows에서 `bat`을 설치할 수 있는 몇 가지 옵션들이 있습니다.
262+Windows에서 `bat`을 설치할 수 있는 몇 가지 옵션들이 있습니다. 먼저 `bat`을 설치 한 후, ["Windows에서 사용하기"](#Windows에서-사용하기) 참고하시기 바랍니다.
380−먼저 `bat`을 설치한 후,
381−["Windows에서 `bat` 사용하기"](#windows에서-bat-사용하기) 섹션을 살펴보세요.
382
263
383−#### 전제 조건
264+#### With Chocolatey
384
265
385−[Visual C++ 재배포 가능](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads)
266+[Chocolatey](https://chocolatey.org/packages/Bat)를 이용해 `bat`을 설치할 수 있습니다:
386−패키지를 설치해야 합니다.
387−
388−#### Chocolatey를 써서
389−
390−[Chocolatey](https://chocolatey.org/packages/Bat)를 이용해 `bat`을 설치할 수
391−있습니다:
392```bash
267```bash
393choco install bat
268choco install bat
394```
269```
395
270
396−#### Scoop을 써서
271+#### With Scoop
397
272
398[scoop](https://scoop.sh/)을 이용해 `bat`을 설치할 수 있습니다:
273[scoop](https://scoop.sh/)을 이용해 `bat`을 설치할 수 있습니다:
399```bash
274```bash
400scoop install bat
275scoop install bat
401```
276```
277+[Visual C++ Redistributable 패키지](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads)를 같이 설치해 주어야 합니다.
402
278
403−#### 사전 빌드된 바이너리들로
279+#### From prebuilt binaries:
404
280
405−[릴리즈 페이지](https://github.com/sharkdp/bat/releases)에서 사전 빌드된
281+[릴리즈 페이지](https://github.com/sharkdp/bat/releases)에서 빌드된 바이너리를 다운받을 수 있습니다.
406−바이너리를 다운받을 수 있습니다.
407
282
408−[Visual C++ 재배포 가능](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads)
283+[Visual C++ Redistributable 패키지](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads)를 같이 설치해 주어야 합니다.
409−패키지를 설치해야 합니다.
410
284
411−### 바이너리들로
285+### Via Docker
412
286
413−[릴리즈 페이지](https://github.com/sharkdp/bat/releases)에서 다양한 아키텍처를
287+컨테이너에서 `bat`을 사용할 수 있는 [Docker image](https://hub.docker.com/r/danlynn/bat/)가 있습니다.:
414−위해 사전 빌드된 버전들을 확인할 수 있습니다.
288+```bash
415−정적 링크 바이너리들은 파일 이름에 `musl` 이 포함된 아카이브들을 확인하세요.
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+```
416
292
417−### 소스에서
293+### Via Ansible
418
294
419−`bat`의 소스를 빌드하기 위해서는, Rust 1.51 이상이 필요합니다.
295+[Ansible](https://www.ansible.com/)을 사용해 `bat`을 설치할 수 있습니다:
420−`cargo`를 이용해 전부 빌드할 수 있습니다:
421
296
422```bash
297```bash
423−cargo install --locked bat
298+# Install role on local machine
299+ansible-galaxy install aeimer.install_bat
424```
300```
425
301
426−참고로 man 페이지나 셸 자동 완성 파일과 같은 부가 파일들은 이 방법으로 설치될 수
302+```yaml
427−없습니다.
303+---
428−이것들은 `cargo`에 의해 생성이 되고 (`build` 밑의) cargo 타켓 폴더에서 찾을 수
304+# Playbook to install bat
429−있습니다.
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
430
320
431−## 사용자화
321+### From binaries
432
322
433−### 문법 강조 테마
323+[릴리즈 페이지](https://github.com/sharkdp/bat/releases)에서 다양한 환경을 위해 빌드된 버전들을 확인 할 수 있습니다. 정적 링크 바이너리들은 아카이브에서 파일 이름에 `musl` 이 포함 파일로 확인 할 수 있습니다.
434
324
435−`bat --list-themes`을 사용하여 사용 가능한 문법 강조 테마들의 목록을 확인할 수
325+### From source
436−있습니다.
437−`TwoDark` 테마를 선택하려면, `--theme=TwoDark` 옵션과 함께 `bat`을 사용하거나
438−`BAT_THEME` 환경 변수를 `TwoDark`로 설정하세요.
439−셸 시작 파일에 `export BAT_THEME="TwoDark"` 를 정의해 영구적으로 설정할 수
440−있습니다.
441−이 밖에 `bat`의 [설정 파일](#설정-파일)을 이용할 수 있습니다.
442
326
443−만약 다른 테마들을 사용하여 특정 파일을 보고 싶다면, 다음 명령어를 쓸 수
327+`bat`의 소스를 직접 빌드하기 위해서는, Rust 1.36 이상이 필요하며 `cargo`를 이용해 빌드할 수 있습니다.
444−있습니다(이 경우 [`fzf`](https://github.com/junegunn/fzf)가 필요합니다.)
445
328
446```bash
329```bash
447−bat --list-themes | fzf --preview="bat --theme={} --color=always /path/to/file"
330+cargo install --locked bat
448```
331```
449
332
450−`bat`은 기본적으로 어두운 배경에 적합합니다.
333+일부 플랫폼에서는 `llvm` 그리고/또는 `libclang-dev` 설치가 필요할 수도 있습니다.
451−그러나 밝은 배경의 터미널을 사용한다면 `GitHub`이나 `OneHalfLight`과 같은 테마가
452−더 잘 어울립니다.
453−아래 [새로운 테마 추가하기](#새로운-테마-추가하기) 섹션에 따라 커스텀 테마를
454−사용할 수도 있습니다.
455
334
456−### 8비트 테마
335+## 커스터마이즈
457
336
458−`bat`은 트루컬러 지원이 되더라도 항상
337+### 문법 강조 테마
459−[8비트 색상](https://en.wikipedia.org/wiki/ANSI_escape_code#Colors)을 사용하는
460−세 개의 테마가 있습니다.
461
338
462−- `ansi`는 어떤 터미널에서도 무난하게 보입니다. 이는 3비트 색상을 사용합니다:
339+`bat --list-themes`을 사용하면, 현재 사용 가능한 문법 강조 테마들을 확인할 수 있습니다. `TwoDark` 테마 선택하는 경우, `--theme=TwoDark` 옵션과 함께 `bat`을 사용하거나 환경변수에서 `BAT_THEME`를 `TwoDark`로 세팅해주면 됩니다. 쉘 시작 파일에 `export BAT_THEME="TwoDark"` 를 정의해 계속 사용도 가능합니다. 이 밖에 `bat`의 [설정 파일](#설정-파일)을 이용할 수도 있습니다.
463− 검정, 빨강, 녹색, 노랑, 파랑, 마젠타, 시안, 하양.
464−- `base16`은 [base16](https://github.com/chriskempson/base16) 터미널 테마를 위해
465− 디자인되었습니다.
466− 이는 [base16 스타일 가이드라인](https://github.com/chriskempson/base16/blob/master/styling.md)에
467− 따라 4비트 색상(3비트 색상에 밝은 변형 추가)을 사용합니다.
468−- `base16-256`는 [base16-shell](https://github.com/chriskempson/base16-shell)을
469− 위해 디자인되었습니다.
470− 이는 16부터 21의 일부 밝은 색상을 8비트 색상으로 대치합니다.
471− 단지 256-색상 터미널을 쓰지만 base16-shell을 쓰지 않는다고 해서 이것을
472− 사용하지 **마십시오**.
473
340
474−이들 테마는 더 제한적이지만, 트루컬러 테마에 비해 두 장점이 있습니다:
341+다른 테마를 미리 보고 싶은경우 다음 명령어와 같이 사용할 수 있습니다.(이 경우 [`fzf`](https://github.com/junegunn/fzf)가 필요합니다.)
475
342
476−- 이들은 3비트 혹은 4비트 색상을 쓰는 다른 터미널 소프트웨어와 더 잘
343+```bash
477− 어울립니다.
344+bat --list-themes | fzf --preview="bat --theme={} --color=always /path/to/file"
478−- 만약 터미널 테마를 바꾼다면, 이미 화면 상의 `bat`의 출력도 이에 맞추어
345+```
479− 업데이트됩니다.
346+`bat`의 기본 테마는 어두운 배경색 터미널에 적합합니다. 만일 밝은 배경색을 사용할 경우에는 `GitHub` 이나 `OneHalfLight` 과 같은 테마가 더 잘 어울립니다. 아래 [새로운 테마 추가하기](#새로운-테마-추가하기)에 따라 커스텀 테마를 사용할수도 있습니다.
480
347
481### 출력 스타일
348### 출력 스타일
482
349
483−`--style` 옵션을 이용하면 `bat`의 출력 모양을 조절할 수 있습니다.
350+`--style` 옵션을 이용하여 `bat`의 출력 스타일을 변경 할 수 있습니다. 예를 들어, `--style=numbers,changes`는 Git 변경분과 라인 넘버에 대해서만 출력하며 눈금과 파일 헤더가 표시되지 않습니다. `BAT_STYLE` 환경 변수로 정의하여 계속해서 사용하거나`bat`의 [설정 파일](#설정-파일)을 사용할 수도 있습니다.
484−예를 들어, `--style=numbers,changes`를 통해 Git 변경분과 줄 번호는 출력하지만
485−격자와 파일 헤더는 출력하지 않을 수 있습니다.
486−`BAT_STYLE` 환경 변수를 정의하여 이러한 수정을 영구적으로 하거나 `bat`의
487−[설정 파일](#설정-파일)을 사용하세요.
488−
489−### 새로운 문법 / 언어 정의 추가하기
490−
491−만약 `bat`에서 특정 문법이 지원되지 않을 경우, 다음의 절차를 통해 현재 `bat`
492−설치본에 새로운 문법을 쉽게 추가할 수 있습니다.
493
351
494−`bat`은 문법 강조를 위해 훌륭한
352+### 새로운 문법 강조 / 언어 추가하기
495−[`syntect`](https://github.com/trishume/syntect/) 라이브러리를 사용합니다.
496−`syntect`는 임의의 [Sublime Text의 `.sublime-syntax`
497−파일](https://www.sublimetext.com/docs/3/syntax.html)과 테마를 읽을 수 있습니다.
498
353
499−[Package Control](https://packagecontrol.io/)에 Sublime 문법 패키지를 찾는
354+`bat`은 문법 강조를 위해 [`syntect`](https://github.com/trishume/syntect/) 라이브러리를 사용하고 있습니다. `syntect`는 [Sublime Text의 `.sublime-syntax` 파일](https://www.sublimetext.com/docs/3/syntax.html)과 테마를 읽을 수 있습니다. 새로운 문법 강조를 추가하는 방법은 다음과 같습니다.
500−방법이 잘 정리되어 있습니다.
501−일단 문법을 찾았다면:
502
355
503−1. 문법 정의 파일들을 넣을 폴더를 만듭니다:
356+우선 문법 정의 파일을 넣을 폴더를 만듭니다:
504
357
505− ```bash
358+```bash
506− mkdir -p "$(bat --config-dir)/syntaxes"
359+mkdir -p "$(bat --config-dir)/syntaxes"
507− cd "$(bat --config-dir)/syntaxes"
360+cd "$(bat --config-dir)/syntaxes"
508−
509− # Put new '.sublime-syntax' language definition files
510− # in this folder (or its subdirectories), for example:
511− git clone https://github.com/tellnobody1/sublime-purescript-syntax
512− ```
513
361
514−2. 이제 다음 명령어를 통해 파일들을 파싱(parse)하여 바이너리 캐시를 만듭니다.
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+```
515
366
516− ```bash
367+다음 명령어를 통해 파일을 바이너리 캐시로 파싱합니다.
517− bat cache --build
518− ```
519
368
520−3. 마지막으로, `bat --list-languages`로 새로 추가한 언어가 사용 가능한지
369+```bash
521− 확인합니다.
370+bat cache --build
371+```
522
372
523− 만약 기본 설정으로 돌아갈 일이 생긴다면, 다음 명령어를 이용합니다:
373+마지막으로 `bat --list-languages`을 통해 새로운 언어가 사용 가능한지 확인합니다.
524
374
525− ```bash
375+기본 설정으로 돌아가려면, 다음 명령어를 이용합니다.:
526− bat cache --clear
527− ```
528
376
529−4. 만약 특정 문법이 `bat`에 기본적으로 포함되어 있어야 한다고 생각한다면, 방침과
377+```bash
530− 절차를 [여기](../doc/assets.md)서 읽은 후 "문법 요청(syntax request)"을 열어
378+bat cache --clear
531− 주세요: [문법 요청하기](https://github.com/sharkdp/bat/issues/new?labels=syntax-request&template=syntax_request.md).
379+```
532
380
533### 새로운 테마 추가하기
381### 새로운 테마 추가하기
534
382
535−이 과정은 새로운 문법 정의 추가 방식과 매우 비슷합니다.
383+새로운 문법 정의 추가와 매우 유사합니다.
536
384
537−먼저, 새로운 문법 강조 테마 폴더를 만듭니다.
385+먼저, 새로운 문법 강조 테마 폴더를 만듭니다.
538```bash
386```bash
539mkdir -p "$(bat --config-dir)/themes"
387mkdir -p "$(bat --config-dir)/themes"
540cd "$(bat --config-dir)/themes"
388cd "$(bat --config-dir)/themes"
@@ -546,93 +394,32 @@ git clone https://github.com/greggb/sublime-snazzy
546bat cache --build
394bat cache --build
547```
395```
548
396
549−마지막으로 `bat --list-themes`을 통해 새로 추가한 테마들이 사용 가능한지
397+마지막으로 `bat --list-themes`을 통해 새로운 테마가 사용 가능한지 확인합니다.
550−확인합니다.
551−
552−### 파일 타입 설정을 추가하거나 변경하기
553−
554−새로운 파일 이름 패턴을 추가하려면 (혹은 이미 존재하는 것을 변경하려면)
555−`--map-syntax` 커맨드 라인 옵션을 사용하세요.
556−이 옵션은 `pattern:syntax` 꼴의 인자를 받습니다.
557−이때 `pattern`은 파일 이름과 절대 파일 경로를 매치할 글로브(glob) 패턴입니다.
558−`syntax` 부분은 지원되는 언어의 전체 이름입니다
559−(`bat --list-languages`를 통해 개요를 확인하세요).
560−
561−참고: 이 옵션은 커맨드 라인에 넘겨 주는 것보다는 `bat`의 설정 파일에 넣는 것이
562−좋을 것입니다 (아래를 보세요).
563−
564−예시: "INI" 문법 강조를 `.conf` 파일 확장자의 모든 파일에 적용하려면, 다음을
565−사용하세요:
566−```bash
567−--map-syntax='*.conf:INI'
568−```
569−
570−예시: `.ignore`(완전 일치)이라는 이름의 모든 파일을 "Git Ignore" 문법으로
571−열려면, 다음을 사용하세요:
572−```bash
573−--map-syntax='.ignore:Git Ignore'
574−```
575−
576−예시: `/etc/apache2`의 하위 폴더들에 있는 모든 `.conf` 파일들을 "Apache Conf"
577−문법으로 열려면, 다음을 사용하세요 (이 대응(mapping)은 이미 내장되어 있습니다):
578−```bash
579−--map-syntax='/etc/apache2/**/*.conf:Apache Conf'
580−```
581
398
582−### 다른 페이저 사용하기
399+### 다른 페이져 사용하기
583
400
584−`bat`은 환경 변수 `PAGER`에 명시된 페이저를 사용합니다.
401+`bat`은 환경변수 `PAGER`로 사용할 페이져를 명시합니다. 만약 이 변수가 정의되어있지 않다면 `less`가 기본입니다. 만약 다른 페이져를 사용하고 싶다면 `PAGER` 변수를 수정하거나 `BAT_PAGER` 환경 변수로 `PAGER` 대신 정의 할 수도 있습니다.
585−이 변수가 정의되어 있지 않다면, `less`가 기본으로 사용됩니다.
586−만약 다른 페이저를 사용하고 싶다면, `PAGER` 변수를 수정하거나 `BAT_PAGER` 환경
587−변수를 설정하여 `PAGER`의 설정을 오버라이드(override)할 수 있습니다.
588
402
589−만약 커맨드라인 인수들을 페이저에게 넘겨 주려면, `PAGER`/`BAT_PAGER` 변수로
403+만약 커맨드라인 인수로 넘기려면, `PAGER`/`BAT_PAGER` 변수를 정의를 통해 사용 할 수 있습니다. :
590−설정할 수 있습니다:
591
404
592```bash
405```bash
593export BAT_PAGER="less -RF"
406export BAT_PAGER="less -RF"
594```
407```
595
408
596−환경 변수를 사용하는 대신, `bat`의 [설정 파일](#설정-파일)로 페이저를 설정할
409+환경 변수 대신, `bat`의 [설정 파일](#설정-파일)에서 페이져를 설정 할 수도 있습니다.(`--pager` 옵션)
597−수도 있습니다 (`--pager` 옵션).
598
410
599−**참고**: 기본적으로, 페이저가 `less`로 설정되어 있다면 (그리고 커맨드 라인
411+**참고**: 기본적으로 페이져가 `less`로 설정 되어있다면, `bat`은 다음 옵션들을 받을 수 있습니다: `-R`/`--RAW-CONTROL-CHARS`,
600−옵션이 지정되어 있지 않다면), `bat`은 다음 옵션들을 페이저로 넘겨줍니다:
412+`-F`/`--quit-if-one-screen` 그리고 `-X`/`--no-init`. 마지막 옵션(`-X`)은 530 이전 버전에서만 사용됩니다.
601−`-R`/`--RAW-CONTROL-CHARS`, `-F`/`--quit-if-one-screen` 그리고 `-X`/`--no-init`.
602−마지막 옵션(`-X`)은 530 이전 버전의 `less`에만 사용됩니다.
603
413
604−`-R` 옵션은 ANSI 색상을 올바르게 해석하기 위해 필요합니다.
414+`-R` 옵션은 ANSI 컬러를 올바르게 해석하기 위해 필요합니다. 두번째 옵션 (`-F`)은 출력 크기가 터미널의 세로 크기보다 작을 경우 즉시 종료되도록 합니다.
605−두 번째 옵션(`-F`)은 출력 크기가 터미널의 세로 크기보다 작을 경우 less가 즉시
415+페이져를 종료하기 위해 `q`를 누를 필요 없기 때문에 작은 파일을 다룰 때 용이합니다. 세번째 옵션(`-X`)는 `less` 이전 버전의 `--quit-if-one-screen` 기능과 함께 버그를 잡을 때 필요합니다. 안타깝게도, `less`의 마우스 휠 지원은 종료합니다.
606−종료되도록 합니다.
607−이는 작은 파일을 다룰 때 페이저를 종료하기 위해 `q`를 누를 필요 없어서
608−편리합니다.
609−세 번째 옵션(`-X`)는 예전 버전의 `less`에 있는 `--quit-if-one-screen` 기능의
610−버그를 고치기 위해 필요합니다.
611−안타깝게도, 이는 `less`의 마우스 휠 지원과 호환되지 않습니다.
612
416
613−`less`의 예전 버전에서 마우스 휠 기능을 활성화하려면, `-R` 옵션을 넘겨주세요
417+`less` 예전 버전에서 마우스 휠 기능을 활성화 시키려면, `-R` 옵션을 사용하면 됩니다. (위의 예제처럼, 이 옵션은 quit-if-one-screen 기능을 비활성화 시킵니다.)
614−(위의 예제처럼, 이 옵션은 quit-if-one-screen 기능을 비활성화합니다).
418+530 이하 버전에서는 그대로 사용할 수 있습니다.
615−less 530과 이후 버전에서는 그대로 사용할 수 있습니다.
616−
617−### 들여쓰기
618−
619−`bat`은 페이저에 의존하지 않고 탭을 4 스페이스로 확장합니다.
620−이를 변경하려면 간단히 `--tabs` 인자에 표시되기를 원하는 스페이스 개수를
621−추가하세요.
622−
623−**참고**: (`bat`의 `--pager` 인자 혹은 `less`의 `LESS` 환경 변수를 통해)
624−페이저의 탭 길이를 지정하는 것은 효과가 없을 것인데, 이는 페이저가 이미
625−스페이스로 확장된 탭을 받기 때문입니다.
626−이 기능은 사이드바에 의한 들여쓰기 문제를 회피하기 위해 추가되었습니다.
627−`bat`을 `--tabs=0`과 함께 호출하면 이를 오버라이드하여 페이저가 탭을 처리하게
628−합니다.
629
419
630### 다크 모드
420### 다크 모드
631
421
632−macOS에서 다크 모드를 사용하고 있다면, `bat`가 OS 테마에 따라 다른 테마를
422+macOS에서 다크 모드를 사용하고 있다면, OS 테마에 따라 다른 테마를 사용하도록 `bat`의 구성할 수 있습니다. 아래 코드는 라이트 모드에서는 `default` 테마를 다크모드에서는 `Github` 테마를 사용하는 방법입니다.
633−사용하도록 구성할 수 있습니다.
634−아래 스니펫은 _다크 모드_에서는 `default` 테마를, _라이트 모드_에서는 `GitHub`
635−테마를 사용하는 방법입니다.
636
423
637```bash
424```bash
638alias cat="bat --theme=\$(defaults read -globalDomain AppleInterfaceStyle &> /dev/null && echo default || echo GitHub)"
425alias cat="bat --theme=\$(defaults read -globalDomain AppleInterfaceStyle &> /dev/null && echo default || echo GitHub)"
@@ -640,89 +427,57 @@ alias cat="bat --theme=\$(defaults read -globalDomain AppleInterfaceStyle &> /de
640
427
641## 설정 파일
428## 설정 파일
642
429
643−`bat`는 설정 파일로도 사용자화 할 수 있습니다.
430+`bat` 설정 파일로 커스터마이즈 할 수 있습니다. 파일의 위치는 운영 체제에 따라 다릅니다. 아래 커맨드를 통해 시스템의 기본 경로를 알 수 있습니다.
644−설정 파일의 위치는 운영 체제에 따라 다릅니다.
645−아래 커맨드를 통해 시스템의 기본 경로를 확인할 수 있습니다.
646```
431```
647bat --config-file
432bat --config-file
648```
433```
649
434
650−또는, `BAT_CONFIG_PATH` 환경 변수를 사용하여 `bat`가 설정 파일의 기본 경로
435+또는, `BAT_CONFIG_PATH` 환경 변수를 사용하여 `bat`의 설정 파일 위치를 지정할 수 있습니다.
651−이외의 위치를 사용하도록 할 수 있습니다.
652```bash
436```bash
653export BAT_CONFIG_PATH="/path/to/bat.conf"
437export BAT_CONFIG_PATH="/path/to/bat.conf"
654```
438```
655
439
656−기본 설정 파일은 `--generate-config-file` 옵션으로 생성할 수 있습니다.
657−```bash
658−bat --generate-config-file
659−```
660−
661### 포맷
440### 포맷
662
441
663−설정 파일은 단순히 커맨드 라인 인자들의 리스트입니다.
442+설정 파일은 명령어 인수들의 리스트 입니다. `bat --help`를 이용하여 가능한 옵션들과 값들을 확인해 볼 수 있습니다. 또, `#` 으로 주석을 추가할수도 있습니다.
664−`bat --help`로 가능한 모든 옵션과 값들을 확인하세요.
665−추가적으로, 줄 앞에 `#` 문자를 추가해 주석을 넣을 수 있습니다.
666
443
667−설정 파일 예시:
444+설정 파일의 예:
668```bash
445```bash
669−# "TwoDark" 테마 설정하기
446+# Set the theme to "TwoDark"
670--theme="TwoDark"
447--theme="TwoDark"
671
448
672−# 줄 번호, Git 변경 내용, 파일 헤더 보이기 (격자 없이)
449+# Show line numbers, Git modifications and file header (but no grid)
673--style="numbers,changes,header"
450--style="numbers,changes,header"
674
451
675−# 터미널에서 이탤릭체 쓰기 (일부 터미널에서 미지원)
452+# Use italic text on the terminal (not supported on all terminals)
676--italic-text=always
453--italic-text=always
677
454
678−# Arduino .ino 파일에 C++ 문법 쓰기
455+# Use C++ syntax for .ino files
679--map-syntax "*.ino:C++"
456--map-syntax "*.ino:C++"
680−```
681−
682−## Windows에서 `bat` 사용하기
683
457
684−`bat`는 대부분의 경우 Windows에서 기본적으로 잘 작동하지만, 일부 기능은 추가적인
458+# Use ".gitignore"-style highlighting for ".ignore" files
685−구성이 필요할 수 있습니다.
459+--map-syntax ".ignore:Git Ignore"
460+```
686
461
687−#### 전제 조건
462+## Windows에서 사용하기
688
463
689−[Visual C++ 재배포 가능](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads)
464+`bat` 대부분의 경우 Windows에서 기본적으로 잘 작동하지만, 일부 기능에는 추가 적인 구성이 필요할 수 있습니다.
690−패키지를 설치해야 합니다.
691
465
692−### 페이징
466+### 페이징
693
467
694−Windows는 `more` 형식의 매우 제한된 페이저만 포함합니다.
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`를 자동으로 설치할 수 있습니다.
695−Windows용 `less` 바이너리는
696−[공식 홈페이지](http://www.greenwoodsoftware.com/less/download.html)나
697−[Chocolatey](https://chocolatey.org/packages/Less)를 통해 다운로드 받을 수
698−있습니다.
699−이를 사용하려면 디렉터리 안의 바이너리를 `PATH`에 넣거나
700−[환경 변수로 정의](#using-a-different-pager)하세요.
701−[Chocolatey 패키지](#on-windows)는 `less`를 자동으로 설치합니다.
702
469
703### 색상
470### 색상
704
471
705−Windows 10은
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/)를 사용할 수 있습니다 .
706−[v1511](https://en.wikipedia.org/wiki/Windows_10_version_history#Version_1511_(November_Update))부터
707−기본적으로 `conhost.exe`(Command Prompt)와 PowerShell에서 색상을 지원하며,
708−최신 버전의 bash에서도 색상을 지원합니다.
709−이전 버전의 Windows에서는, [ConEmu](https://conemu.github.io/)가 포함된
710−[Cmder](http://cmder.net/)를 사용할 수 있습니다.
711
473
712−**참고:** Git과 MSYS 버전의 `less`는 Windows에서 색상을 올바르게 해석하지
474+**참고:** `less`의 Git과 MSYS 버전은 Windows에서 색상을 올바르게 해석하지 않습니다. 다른 페이져가 설치되어 있지 않은 경우, `--paging=never` 하거나 `BAT_PAGER`를 빈 문자열로 설정하여 페이징을 완전히 비활성화 할 수 있습니다 .
713−않습니다.
714−다른 페이저가 설치되어 있지 않은 경우, `--paging=never`을 넘겨주거나
715−`BAT_PAGER`을 빈 문자열로 설정하여 페이징을 완전히 비활성화 할 수 있습니다.
716
475
717### Cygwin
476### Cygwin
718
477
719−Windows에서의 `bat`은 기본적으로 Cygwin의 unix 스타일 경로(`/cygdrive/*`)를
478+Windows에서의 `bat`은 기본적으로 Cygwin의 unix 스타일의 경로(`/cygdrive/*`)를 지원하지 않습니다. cygwin 절대경로를 인자로 받았을 때, `bat`은 다음과 같이 오류를 반환합니다. `:The system cannot find the path specified. (os error 3)`
720−지원하지 않습니다.
721−Cygwin 절대 경로를 인자로 받았을 때, `bat`은 다음과 같은 오류를 반환합니다:
722−`The system cannot find the path specified. (os error 3)`
723
479
724−이는 wrapper를 만들거나 다음 함수를 `.bash_profile`에 추가하여 해결할 수
480+이 경우, wrapper를 만들거나 다음 함수를 `.bash_profile`추가하여 문제를 해결하실 수 있습니다 :
725−있습니다:
726
481
727```bash
482```bash
728bat() {
483bat() {
@@ -738,98 +493,68 @@ bat() {
738}
493}
739```
494```
740
495
741−## 문제 해결
496+## 트러블슈팅
742
497
743### 터미널과 색상
498### 터미널과 색상
744
499
745−`bat`은 터미널의 트루컬러 지원 여부와 상관 없이 동작합니다.
500+`bat`은 터미널 트루컬러 지원 여부와 상관없이 동작합니다. 하지만, 문법 강조 테마의 색상이 8-bit 컬러에는 최적화 되어 있지 않고 있으며, 24-bit 트루컬러 지원하는 터미널 사용하는 것을 적극 권장합니다.(`terminator`, `konsole`, `iTerm2`, ...). [이 글](https://gist.github.com/XVilka/8346728)에서 24-bit 트루컬러 지원하는 터미널들을 찾아보실 수 있습니다.
746−그러나 대부분 문법 강조 테마의 색상은 8비트 색상에 최적화되어 있지 않습니다.
747−따라서 24비트 트루컬러 지원이 되는 터미널(`terminator`, `konsole`, `iTerm2`,
748−...)을 사용하는 것을 적극 권장합니다.
749−트루컬러를 지원하는 터미널들과 더 자세한 정보는
750−[이 글](https://gist.github.com/XVilka/8346728)에서 찾아보실 수 있습니다.
751
501
752−사용하고 있는 트루컬러 터미널에서 `COLORTERM` 변수를 `truecolor` 혹은
502+사용하고 있는 터미널에서 `COLORTERM`을 `truecolor` 혹은
753−`24bit`로 설정되어 있는지 확인하세요.
503+`24bit`으로 설정 되어있는지 확인하세요. 만약 아니라면, `bat`은 24-bit escape sequence를 지원되는지 여부를 판단 할 수 없습니다. (그리고 8-bit 색상으로 돌아갑니다.)
754−그렇지 않을 경우, `bat`은 24비트 확장열(escape sequence)이 지원되는지 여부를
755−판단할 수 없습니다 (그리고 8비트 색상을 사용합니다).
756
504
757−### 줄 번호와 격자가 잘 보이지 않는 경우
505+### 라인 숫자와 눈금이 잘 보이지 않는 경우
758
506
759−다른 테마를 사용해 보세요 (`bat --list-themes`에서 목록을 볼 수 있습니다).
507+다른 테마를 사용해 보세요. (`bat --list-themes`에서 테마들을 확인해 볼 수 있습니다.) `OneHalfDark` 과 `OneHalfLight` 테마는 눈금과 선의 색을 밝게 합니다.
760−`OneHalfDark`와 `OneHalfLight` 테마는 더 밝은 눈금과 선의 색상을 사용합니다.
761
508
762### 파일 인코딩
509### 파일 인코딩
763
510
764−`bat`은 기본적으로 UTF-8과 UTF-16을 지원합니다.
511+`bat`은 기본적으로 UTF-8과 UTF-8을 제공합니다. 다른 파일 인코딩의 경우, 자동 감지 되지 않으므로 UTF-8로 먼저 변환해 주어야 합니다. 이렇게 할 때, `iconv`를 사용 할 수 있습니다. 예를 들어, Latin-1 (ISO-8859-1)로 인코딩된 PHP파일이라면 다음과 같이 사용할 수 있습니다.:
765−다른 모든 종류의 파일 인코딩에 대해서는, 일반적으로 인코딩을 자동으로 판별하는
766−방법이 없기 때문에 먼저 UTF-8으로 변환해야 할 수 있습니다.
767−이를 위해 `iconv`를 사용할 수 있습니다.
768−예시: Latin-1(ISO-8859-1)로 인코딩된 PHP 파일은 다음과 같이 처리할 수 있습니다:
769``` bash
512``` bash
770iconv -f ISO-8859-1 -t UTF-8 my-file.php | bat
513iconv -f ISO-8859-1 -t UTF-8 my-file.php | bat
771```
514```
772−참고: `bat`으로 문법 자동 감지가 되지 않는 경우에는 `-l`/`--language` 옵션을
515+참고: `bat`으로 자동 감지가 되지 않는 경우에는 `-l`/`--language` 옵션을 사용할 수도 있습니다.
773−사용할 수 있습니다.
774
516
775−## 개발
517+## 배포
776
518
777```bash
519```bash
778−# 모든 서브모듈을 받기 위해 재귀적으로 복제하기
520+# Recursive clone to retrieve all submodules
779git clone --recursive https://github.com/sharkdp/bat
521git clone --recursive https://github.com/sharkdp/bat
780
522
781−# (디버그 버전) 빌드
523+# Build (debug version)
782cd bat
524cd bat
783cargo build --bins
525cargo build --bins
784
526
785−# 단위 테스트와 통합 테스트 실행
527+# Run unit tests and integration tests
786cargo test
528cargo test
787
529
788−# (배포 버전) 설치
530+# Install (release version)
789cargo install --locked
531cargo install --locked
790
532
791−# 수정된 문법과 테마가 적용된 bat 바이너리 빌드
533+# Build a bat binary with modified syntaxes and themes
792bash assets/create.sh
534bash assets/create.sh
793cargo install --locked --force
535cargo install --locked --force
794```
536```
795
537
796−`bat`의 pretty-printing 기능을 라이브러리로 사용하는 애플리케이션을 만들고
797−싶다면, [API 문서](https://docs.rs/bat/)를 살펴보세요.
798−참고로 `bat`에 라이브러리로써 의존한다면, `regex-onig`나 `regex-fancy`를
799−기능으로 사용해야 합니다.
800−
801−## 기여하기
802−
803−[`CONTRIBUTING.md`](../CONTRIBUTING.md) 가이드를 살펴보세요.
804−
805## 메인테이너들
538## 메인테이너들
806
539
807- [sharkdp](https://github.com/sharkdp)
540- [sharkdp](https://github.com/sharkdp)
808- [eth-p](https://github.com/eth-p)
541- [eth-p](https://github.com/eth-p)
809−- [keith-hall](https://github.com/keith-hall)
810−- [Enselic](https://github.com/Enselic)
811−
812−## 보안 취약점
813−
814−만약 `bat`의 취약점을 발견하였다면, [David Peter](https://david-peter.de/)에게 메일로 연락주시기 바랍니다.
815
542
816## 프로젝트 목표와 대안들
543## 프로젝트 목표와 대안들
817
544
818−`bat`은 다음과 같은 목표를 달성하려고 합니다:
545+`bat`은 아래와 같은 목표를 달성하려고 합니다:
546+
547+- 아름답고 발전된 문법 강조 기능
548+- Git 연동을 통한 파일 수정 내역 확인
549+- (POSIX)`cat`의 대체제
550+- 사용자 친화적인 CLI 제공
819
551
820−- 아름답고 발전된 문법 강조 기능 제공
821−- Git과의 연동을 통한 파일 변경 내용 확인
822−- (POSIX) `cat`의 대체제
823−- 사용자 친화적인 커맨드 라인 인터페이스 제공
824
552
825−비슷한 프로그램들을 찾고 있다면 많은 대안들이 있습니다.
553+비슷한 프로그램들을 찾고 있다면, 많은 대안들이 있습니다. 비교는 [이 문서]((doc/alternatives.md))를 참조해주세요.
826−비교는 [이 문서](../doc/alternatives.md)를 참조해 주세요.
827
554
828## 라이센스
555## 라이센스
829−Copyright (c) 2018-2021 [bat-developers](https://github.com/sharkdp/bat).
556+Copyright (c) 2018-2020 [bat-developers](https://github.com/sharkdp/bat).
830
557
831−`bat`는 여러분의 선택에 따라 MIT 라이센스 또는 Apache 라이센스 2.0의 조건에 따라
558+`bat`는 MIT 라이센스 및 Apache 라이센스 2.0의 조건에 따라 배포됩니다.
832−배포됩니다.
833
559
834−라이센스의 세부사항은 [LICENSE-APACHE](../LICENSE-APACHE)와
560+라이센스 세부사항은 [LICENSE-APACHE](LICENSE-APACHE)와 [LICENSE-MIT](LICENSE-MIT)를 참조하세요.
835−[LICENSE-MIT](../LICENSE-MIT)를 참조하세요.
doc/README-ru.md+13−16
@@ -1,6 +1,7 @@
1<p align="center">
1<p align="center">
2− <img src="logo-header.svg" alt="bat - a cat clone with wings"><br>
2+ <img src="doc/logo-header.svg" alt="bat - a cat clone with wings"><br>
3− <a href="https://github.com/sharkdp/bat/actions?query=workflow%3ACICD"><img src="https://github.com/sharkdp/bat/workflows/CICD/badge.svg" alt="Build Status"></a>
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>
4 <img src="https://img.shields.io/crates/l/bat.svg" alt="license">
5 <img src="https://img.shields.io/crates/l/bat.svg" alt="license">
5 <a href="https://crates.io/crates/bat"><img src="https://img.shields.io/crates/v/bat.svg?colorB=319e8c" alt="Version info"></a><br>
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>
6 Клон утилиты <i>cat(1)</i> с поддержкой выделения синтаксиса и Git
7 Клон утилиты <i>cat(1)</i> с поддержкой выделения синтаксиса и Git
@@ -11,12 +12,8 @@
11 <a href="#как-использовать">Использование</a> •
12 <a href="#как-использовать">Использование</a> •
12 <a href="#установка">Установка</a> •
13 <a href="#установка">Установка</a> •
13 <a href="#кастомизация">Кастомизация</a> •
14 <a href="#кастомизация">Кастомизация</a> •
14− <a href="#цели-и-альтернативы">Цели и альтернативы </a><br>
15+ <a href="#цели-и-альтернативы">Цели и альтернативы </a> •
15− [<a href="../README.md">English]
16+ Перевод [<a href="https://github.com/chinanf-boy/bat-zh">中文</a>][<a href="doc/README-ja.md">日本語</a>][<a href="doc/README-ko.md">한국어</a>][<a href="doc/README-ru.md">Русский</a>]
16− [<a href="README-zh.md">中文</a>]
17− [<a href="README-ja.md">日本語</a>]
18− [<a href="README-ko.md">한국어</a>]
19− [Русский]
20</p>
17</p>
21
18
22### Выделение синтаксиса
19### Выделение синтаксиса
@@ -160,7 +157,7 @@ man 2 select
160
157
161## Установка
158## Установка
162
159
163−[![Packaging status](https://repology.org/badge/vertical-allrepos/bat-cat.svg)](https://repology.org/project/bat-cat/versions)
160+[![Packaging status](https://repology.org/badge/vertical-allrepos/bat.svg)](https://repology.org/project/bat/versions)
164
161
165### Ubuntu (с помощью `apt`)
162### Ubuntu (с помощью `apt`)
166*... и другие дистрибутивы основанные на Debian.*
163*... и другие дистрибутивы основанные на Debian.*
@@ -188,7 +185,7 @@ ln -s /usr/bin/batcat ~/.local/bin/bat
188[release page](https://github.com/sharkdp/bat/releases) и установить так:
185[release page](https://github.com/sharkdp/bat/releases) и установить так:
189
186
190```bash
187```bash
191−sudo dpkg -i bat_0.18.3_amd64.deb # измените архитектуру и версию
188+sudo dpkg -i bat_0.16.0_amd64.deb # измените архитектуру и версию
192```
189```
193
190
194### Alpine Linux
191### Alpine Linux
@@ -344,7 +341,7 @@ ansible-galaxy install aeimer.install_bat
344
341
345### Из исходников
342### Из исходников
346
343
347−Если вы желаете установить `bat` из исходников, вам понадобится Rust 1.51 или выше. После этого используйте `cargo`, чтобы все скомпилировать:
344+Если вы желаете установить `bat` из исходников, вам понадобится Rust 1.40 или выше. После этого используйте `cargo`, чтобы все скомпилировать:
348
345
349```bash
346```bash
350cargo install --locked bat
347cargo install --locked bat
@@ -437,11 +434,11 @@ export BAT_PAGER="less -RF"
437 `-R`/`--RAW-CONTROL-CHARS`,
434 `-R`/`--RAW-CONTROL-CHARS`,
438`-F`/`--quit-if-one-screen` и `-X`/`--no-init`. Последний флаг(`-X`) используется только для `less`, чья версия раньше 530.
435`-F`/`--quit-if-one-screen` и `-X`/`--no-init`. Последний флаг(`-X`) используется только для `less`, чья версия раньше 530.
439
436
440−Флаг `-R` нужен чтобы корректно воспроизвести ANSI цвета. Второй флаг (`-F`) говорит
437+Флаг `-R` нужен чтобы корректно воспроизвести ANSI цвета. Второй флаг (`-F`) говорит
441`less` чтобы тот сразу же завершился, если размер вывода меньше чем вертикальный размер терминала.
438`less` чтобы тот сразу же завершился, если размер вывода меньше чем вертикальный размер терминала.
442Это удобно для небольших файлов, так как вам не надо каждый раз нажимать `q`, чтобы выйти из пейджера. Третий флаг (`-X`) нужен для того, чтобы исправить баг с `--quit-if-one-screen` в старых версиях `less`. К сожалению, это блокирует возможность использования колеса мышки.
439Это удобно для небольших файлов, так как вам не надо каждый раз нажимать `q`, чтобы выйти из пейджера. Третий флаг (`-X`) нужен для того, чтобы исправить баг с `--quit-if-one-screen` в старых версиях `less`. К сожалению, это блокирует возможность использования колеса мышки.
443
440
444−Если вы хотите все же его включить, вы можете добавить флаг `-R`.
441+Если вы хотите все же его включить, вы можете добавить флаг `-R`.
445Для `less` новее чем 530 оно должно работать из коробки.
442Для `less` новее чем 530 оно должно работать из коробки.
446
443
447### Темная тема
444### Темная тема
@@ -484,7 +481,7 @@ bat --generate-config-file
484# Использовать курсив (поддерживается не всеми терминалами)
481# Использовать курсив (поддерживается не всеми терминалами)
485--italic-text=always
482--italic-text=always
486
483
487−# Использовать синтаксис C++ для всех Arduino .ino файлов
484+# Использовать синтаксис C++ для всех .ino файлов
488--map-syntax "*.ino:C++"
485--map-syntax "*.ino:C++"
489
486
490# Использовать синтаксик Git Ignore для всех файлов .ignore
487# Использовать синтаксик Git Ignore для всех файлов .ignore
@@ -502,7 +499,7 @@ Windows поддерживает только очень простой пейд
502### Цвета
499### Цвета
503
500
504Windows 10 поддерживает цвета и в `conhost.exe` (Command Prompt), и в PowerShell начиная с версии Windows
501Windows 10 поддерживает цвета и в `conhost.exe` (Command Prompt), и в PowerShell начиная с версии Windows
505−[v1511](https://ru.wikipedia.org/wiki/Windows_10#Обновления и поддержка), так же как и в bash. На ранних версиях Windows вы можете использовать
502+[v1511](https://ru.wikipedia.org/wiki/Windows_10#Обновления и поддержка), так же как и в bash. На ранних версиях Windows вы можете использовать
506[Cmder](http://cmder.net/), в котором есть [ConEmu](https://conemu.github.io/).
503[Cmder](http://cmder.net/), в котором есть [ConEmu](https://conemu.github.io/).
507
504
508**Внимание:** Версия `less` в Git и MSYS2 воспроизводит цвета некорректно. Если у вас нет других пейджеров, мы можете отключить использование пейджеров с помощью флага `--paging=never`
505**Внимание:** Версия `less` в Git и MSYS2 воспроизводит цвета некорректно. Если у вас нет других пейджеров, мы можете отключить использование пейджеров с помощью флага `--paging=never`
@@ -590,7 +587,7 @@ cargo install --locked --force
590Есть очень много альтернатив `bat`. Смотрите [этот документ](doc/alternatives.md) для сравнения.
587Есть очень много альтернатив `bat`. Смотрите [этот документ](doc/alternatives.md) для сравнения.
591
588
592## Лицензия
589## Лицензия
593−Copyright (c) 2018-2021 [Разработчики bat](https://github.com/sharkdp/bat).
590+Copyright (c) 2018-2020 [Разработчики bat](https://github.com/sharkdp/bat).
594
591
595`bat` распостраняется под лицензями MIT License и Apache License 2.0 (на выбор пользователя).
592`bat` распостраняется под лицензями MIT License и Apache License 2.0 (на выбор пользователя).
596
593
doc/README-zh.mddeleted−678
@@ -1,678 +0,0 @@
1−<p align="center">
2− <img src="logo-header.svg" alt="bat - a cat clone with wings"><br>
3− <a href="https://github.com/sharkdp/bat/actions?query=workflow%3ACICD"><img src="https://github.com/sharkdp/bat/workflows/CICD/badge.svg" alt="Build Status"></a>
4− <img src="https://img.shields.io/crates/l/bat.svg" alt="license">
5− <a href="https://crates.io/crates/bat"><img src="https://img.shields.io/crates/v/bat.svg?colorB=319e8c" alt="Version info"></a><br>
6− 类似 <i>cat(1)</i>,但带有 git 集成和语法高亮.
7−</p>
8−
9−<p align="center">
10− <a href="#语法高亮">主要功能</a> •
11− <a href="#如何使用">使用方法</a> •
12− <a href="#安装">安装</a> •
13− <a href="#自定义">自定义</a> •
14− <a href="#project-goals-and-alternatives">项目目标和替代方案</a><br>
15− [<a href="../README.md">English</a>]
16− [中文]
17− [<a href="README-ja.md">日本語</a>]
18− [<a href="README-ko.md">한국어</a>]
19− [<a href="README-ru.md">Русский</a>]
20−</p>
21−
22−### 语法高亮
23−
24−`bat` 对大部分编程语言和标记语言提供语法高亮:
25−
26−![Syntax highlighting example](https://imgur.com/rGsdnDe.png)
27−
28−### Git 集成
29−
30−`bat` 能从 git 中获取文件的修改并展示在边栏(见下图):
31−
32−![Git integration example](https://i.imgur.com/2lSW4RE.png)
33−
34−### 不可打印(non-printable)字符可视化
35−
36−添加`-A`/`--show-all`参数可以文件文件中的不可打印字符:
37−
38−![Non-printable character example](https://i.imgur.com/WndGp9H.png)
39−
40−### 自动分页
41−
42−`bat`会在一般情况下将大于屏幕可显示范围的内容输出到分页器(pager, e.g. `less`)。
43−
44−你可以在调用时添加`--paging=never`参数来使`bat`不使用分页器(就像`cat`一样)。如果你想要用为`cat`使用`bat`别名,可以在 shell 配置文件(shell configuration)中添加`alias cat='bat --paging=never'`。
45−
46−#### 智能输出
47−
48−`bat`能够在设置了分页器选项的同时进行管道:wink:。
49−当`bat`检测到当前环境为非可交互终端或管道时(例如使用`bat`并将内容用管道输出到文件),`bat`会像`cat`一样,一次输出文件内容为纯文本且无视`--paging`参数。
50−
51−## 如何使用
52−
53−在终端中查看一个文件
54−
55−```bash
56−> bat README.md
57−```
58−
59−一次性展示多个文件
60−
61−```bash
62−> bat src/*.rs
63−```
64−
65−从`stdin`读入流,自动为内容添加语法高亮(前提是输入内容的语言可以被正确识别,通常根据内容第一行的 shebang 标记,形如`#!bin/sh`)
66−
67−```bash
68−> curl -s https://sh.rustup.rs | bat
69−```
70−
71−显式指定`stdin`输入的语言
72−
73−```bash
74−> yaml2json .travis.yml | json_pp | bat -l json
75−```
76−
77−显示不可打印字符
78−
79−```bash
80−> bat -A /etc/hosts
81−```
82−
83−与`cat`的兼容性
84−
85−```bash
86−bat > note.md # 创建一个空文件
87−
88−bat header.md content.md footer.md > document.md
89−
90−bat -n main.rs # 只显示行号
91−
92−bat f - g # 输出 f,接着是标准输入流,最后 g
93−```
94−
95−### 第三方工具交互
96−
97−#### `fzf`
98−
99−你可以使用`bat`作为`fzf`的预览器。这需要在`bat`后添加`--color=always`选项,以及`--line-range` 选项来限制大文件的加载次数。
100−
101−```bash
102−fzf --preview 'bat --color=always --style=numbers --line-range=:500 {}'
103−```
104−
105−更多信息请参阅[`fzf`的说明](https://github.com/junegunn/fzf#preview-window)。
106−
107−#### `find` 或 `fd`
108−
109−你可以使用`find`的`-exec`选项来用`bat`预览搜索结果:
110−
111−```bash
112−find … -exec bat {} +
113−```
114−
115−亦或者在用`fd`时添加`-X`/`--exec-batch`选项:
116−
117−```bash
118−fd … -X bat
119−```
120−
121−#### `ripgrep`
122−
123−`bat`也能用`batgrep`来显示`ripgrep`的搜索结果。
124−
125−```bash
126−batgrep needle src/
127−```
128−
129−#### `tail -f`
130−
131−当与`tail -f`一起使用,`bat`可以持续监视文件内容并为其添加语法高亮。
132−
133−```bash
134−tail -f /var/log/pacman.log | bat --paging=never -l log
135−```
136−
137−注意:这项功能需要在关闭分页时使用,同时要手动指定输入的内容语法(通过`-l log`)。
138−
139−#### `git`
140−
141−`bat`也能直接接受来自`git show`的输出并为其添加语法高亮(当然也需要手动指定语法):
142−
143−```bash
144−git show v0.6.0:src/main.rs | bat -l rs
145−```
146−
147−#### `git diff`
148−
149−`bat`也可以和`git diff`一起使用:
150−
151−```bash
152−batdiff() {
153− git diff --name-only --diff-filter=d | xargs bat --diff
154−}
155−```
156−
157−该功能也作为一个独立工具提供,你可以在[`bat-extras`](https://github.com/eth-p/bat-extras)中找到`batdiff`。
158−
159−如果你想了解更多 git 和 diff 的信息,参阅[`delta`](https://github.com/dandavison/delta)。
160−
161−#### `xclip`
162−
163−当需要拷贝文件内容时,行号以及 git 标记会影响输出,此时可以使用`-p`/`--plain`参数来把纯文本传递给`xclip`。
164−
165−```bash
166−bat main.cpp | xclip
167−```
168−
169−`bat`会检测输出是否是管道重定向来决定是否使用纯文本输出。
170−
171−#### `man`
172−
173−`bat`也能给`man`的输出上色。这需要设置`MANPAGER`环境变量:
174−
175−```bash
176−export MANPAGER="sh -c 'col -bx | bat -l man -p'"
177−man 2 select
178−```
179−
180−(如果你使用的是 Debian 或者 Ubuntu,使用`batcat`替换`bat`)
181−
182−如果你遇到格式化问题,设置`MANROFFOPT="-c"`也许会有帮助。
183−
184−`batman`能提供类似功能——作为一个独立的命令。
185−
186−注意:[man page 语法](assets/syntaxes/02_Extra/Manpage.sublime-syntax) 还需要完善。在使用特定的`man`实现时该功能[无法正常工作](https://github.com/sharkdp/bat/issues/1145)。
187−
188−#### `prettier` / `shfmt` / `rustfmt`
189−
190−`prettybat`脚本能够格式化代码并用`bat`输出。
191−
192−## 安装
193−
194−[![Packaging status](https://repology.org/badge/vertical-allrepos/bat-cat.svg)](https://repology.org/project/bat-cat/versions)
195−
196−### Ubuntu (使用 `apt`)
197−
198−*... 以及其他基于 Debian的发行版.*
199−
200−`bat` 要求的版本: [Ubuntu 高于 20.04 ("Focal")](https://packages.ubuntu.com/search?keywords=bat&exact=1) 和 [Debian 高于 August 2021 (Debian 11 - "Bullseye")](https://packages.debian.org/bullseye/bat).
201−
202−当你的发行版满足条件那么直接在终端运执行:
203−
204−```bash
205−sudo apt install bat
206−```
207−
208−重要:如果你通过这种方法安装`bat`,请留意你所安装的可执行文件是否为`batcat`(由[其他包的可执行文件名冲突](https://github.com/sharkdp/bat/issues/982)造成)。你可以创建一个`bat -> batcat`的符号链接(symlink)或别名来避免因为可执行文件不同带来的问题并与其他发行版保持一致性。
209−
210−```bash
211−mkdir -p ~/.local/bin
212−ln -s /usr/bin/batcat ~/.local/bin/bat
213−```
214−
215−### Ubuntu (使用`.deb`包)
216−
217−*... 以及其他基于 Debian的发行版.*
218−
219−如果你无法使用上一种方法安装,或需要用最新版的`bat`,你可以从[release 页面](https://github.com/sharkdp/bat/releases)下载最新的`.deb`包并通过下述方法安装:
220−
221−```bash
222−sudo dpkg -i bat_0.18.3_amd64.deb # adapt version number and architecture
223−```
224−
225−### Alpine Linux
226−
227−你可以用下面下列命令从官方源中安装[`bat 包`](https://pkgs.alpinelinux.org/packages?name=bat):
228−
229−```bash
230−apk add bat
231−```
232−
233−### Arch Linux
234−
235−你可以用下面下列命令从官方源中安装[`bat`包](https://www.archlinux.org/packages/community/x86_64/bat/):
236−
237−```bash
238−pacman -S bat
239−```
240−
241−### Fedora
242−
243−你可以使用下列命令从官方[Fedora Modular](https://docs.fedoraproject.org/en-US/modularity/using-modules/)仓库安装[`bat` 包](https://koji.fedoraproject.org/koji/packageinfo?packageID=27506):
244−
245−```bash
246−dnf install bat
247−```
248−
249−### Funtoo Linux
250−
251−你可以从 dev-kit 中安装[`bat` 包](https://github.com/funtoo/dev-kit/tree/1.4-release/sys-apps/bat):
252−
253−```bash
254−emerge sys-apps/bat
255−```
256−
257−### Gentoo Linux
258−
259−你可以使用下列命令从官方源中安装 [`bat` 包](https://packages.gentoo.org/packages/sys-apps/bat):
260−
261−
262−```bash
263−emerge sys-apps/bat
264−```
265−
266−### Void Linux
267−
268−你可以用 xbps-install 安装`bat`:
269−
270−```bash
271−xbps-install -S bat
272−```
273−
274−### Termux:
275−
276−你可以用 pkg 安装`bat:
277−
278−```bash
279−pkg install bat
280−```
281−
282−### FreeBSD
283−
284−你可以用 pkg 来安装一份预编译的[`bat` 包](https://www.freshports.org/textproc/bat):
285−
286−```bash
287−pkg install bat
288−```
289−
290−或从 FreeBSD ports 自己编译一份:
291−
292−```bash
293−cd /usr/ports/textproc/bat
294−make install
295−```
296−
297−### OpenBSD
298−
299−你可以用`pkg——add`安装`bat`包
300−
301−```bash
302−pkg_add bat
303−```
304−
305−### 通过 nix
306−
307−你可以用[nix 包管理器](https://nixos.org/nix)安装`bat`:
308−
309−```bash
310−nix-env -i bat
311−```
312−
313−### openSUSE
314−
315−你可以用 zypper 安装`bat`:
316−
317−```bash
318−zypper install bat
319−```
320−
321−### 通过 snap
322−
323−目前还没有推荐的 snap 包可用。可以使用其他现存的包但不会受到官方支持且可能会遇到[问题](https://github.com/sharkdp/bat/issues/1519)。
324−
325−### macOS (或 Linux) 通过 Homebrew
326−
327−你可以用 [Homebrew on MacOS](https://formulae.brew.sh/formula/bat) 或者 [Homebrew on Linux](https://formulae.brew.sh/formula-linux/bat) 安装`bat`:
328−
329−```bash
330−brew install bat
331−```
332−
333−### macOS 通过 MacPorts
334−
335−或用 [MacPorts](https://ports.macports.org/port/bat/summary) 安装`bat`:
336−
337−```bash
338−port install bat
339−```
340−
341−### Windows
342−
343−在 Windows 上具有多种安装`bat`的方法。若你已完成安装,记得看看 ["在 Windows 上使用`bat`"](#在-Windows-中使用-bat) 。
344−
345−#### 前置条件
346−
347−你必须已安装 [Visual C++ Redistributable](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads) 包。
348−
349−#### 使用 Chocolatey
350−
351−你可以用[Chocolatey](https://chocolatey.org/packages/Bat) 安装`bat`:
352−
353−```bash
354−choco install bat
355−```
356−
357−#### 使用 Scoop
358−
359−你可以用 [scoop](https://scoop.sh/) 安装`bat`:
360−
361−```bash
362−scoop install bat
363−```
364−
365−#### 使用预编译二进制版本
366−
367−直接从 [Release 发布页](https://github.com/sharkdp/bat/releases) 下载已经编译好的二进制包,前提是你安装了 [Visual C++ Redistributable](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads) 包。
368−
369−### 使用二进制版本
370−
371−在 [Release 发布页](https://github.com/sharkdp/bat/releases) 中可以找到为多种架构构建的`bat`版本和静态编译的二进制文件(文件名带有`musl`)。
372−
373−### 从源码编译
374−
375−如果你想要自己构建`bat`,那么你需要安装有高于1.51版本的 Rust。
376−
377−使用以下命令编译。
378−
379−```bash
380−cargo install --locked bat
381−```
382−
383−注意:man page或 shell 自动补全所需要的额外文件无法通过该方法安装。但你可以在`cargo`的生成目录找到这些文件(`build`目录下)。
384−
385−## 自定义
386−
387−### 语法高亮主题
388−
389−使用 `bat --list-themes` 一份语法高亮主题的清单,然后用`--theme=TwoDark`来指定主题为`TwoDark`,也可以通过设置`BAT_THEME`环境变量来选定主题。把`export BAT_THEME="TwoDark"`添加到 shell 的启动脚本(shell startup file)来取得永久效果。或者使用`bat`的[配置文件](#c配置文件)
390−
391−若想要查看所有主题在一个文件上的显示效果可以用一下命令(需要安装`fzf`):
392−
393−```bash
394−bat --list-themes | fzf --preview="bat --theme={} --color=always /path/to/file"
395−```
396−
397−`bat`在默认情况下能够在黑色主题背景下获得较好的效果,如果你的终端使用亮色背景,可以试试`GitHub`或`OneHalfLight`。想要添加自定义主题可以参考[添加主题](#添加主题)。
398−
399−### 8-bit 主题
400−
401−`bat` 自带三个 [8-bit 色彩](https://en.wikipedia.org/wiki/ANSI_escape_code#Colors) 主题:
402−
403−- `ansi` 适应于大部分终端。它使用 3-bit 色彩:黑红绿黄蓝洋红靛青白。
404−- `base16`专为 [base16](https://github.com/chriskempson/base16) 终端设计。它使用 4-bit 色彩(带有亮度的 3-bit 色彩)。根据 [base16 styling guidelines](https://github.com/chriskempson/base16/blob/master/styling.md) 制作。
405−- `base16-25`专为 [base16-shell](https://github.com/chriskempson/base16-shell) 设计。它把部分亮色替换为 8-bit 色彩。请不要直接使用该主题,除非你清楚你的256色终端是否使用 base16-shell。
406−
407−尽管这些主题具有诸多限制,但具有一些 truecolor 主题不具有的三个优点:
408−
409−- 享有最佳兼容性。并不是所有终端工具都支持高于 3-bit 的色彩。
410−- 适应终端主题。
411−- 视觉上和其他的终端工具更协调。
412−
413−### 输出样式
414−
415−你可以用`--style`参数来控制`bat`输出的样式。使用`--style=numbers,chanegs`可以只开启 Git 修改和行号显示而不添加其他内容。`BAT_STYLE`环境变量具有相同功能。
416−
417−### 添加新的语言和语法
418−
419−当现有的`bat`不支持某个语言或语法时你可以自己添加。
420−
421−`bat`使用`syntect`库来支持语法高亮,该库使用 [Sublime Text `.sublime-syntax` 语法文件](https://www.sublimetext.com/docs/3/syntax.html)和主题。而后者中的大部分可以在 [Package Control](https://packagecontrol.io/) 找到。
422−
423−当你找到一份语法文件,按照下列方法:
424−
425−1. 创建包含语法描述文件的目录:
426−
427− ```bash
428− mkdir -p "$(bat --config-dir)/syntaxes"
429− cd "$(bat --config-dir)/syntaxes"
430−
431− # Put new '.sublime-syntax' language definition files
432− # in this folder (or its subdirectories), for example:
433− git clone https://github.com/tellnobody1/sublime-purescript-syntax
434− ```
435−
436−2. 调用下面指令把文件转换为二进制缓存:
437−
438− ```bash
439− bat cache --build
440− ```
441−
442−3. 最后用`bat --list-languages`来检查新的语法是否被成功导入。如果想要回滚到最初状态,执行:
443−
444− ```bash
445− bat cache --clear
446− ```
447−
448−4. 如果你觉得`bat`有必要自带该语法支持,请在阅读[指导](doc/assets.md)后向仓库提交 [Syntax Request](https://github.com/sharkdp/bat/issues/new?labels=syntax-request&template=syntax_request.md)。
449−
450−### 添加主题
451−
452−类似添加语法支持,第一步也是创建一个带有语法高亮的目录
453−
454−```bash
455−mkdir -p "$(bat --config-dir)/themes"
456−cd "$(bat --config-dir)/themes"
457−
458−# 下载一个主题
459−git clone https://github.com/greggb/sublime-snazzy
460−
461−# 更新二进制缓存
462−bat cache --build
463−```
464−
465−然后用`bat --list-themes`检查添加是否成功。
466−
467−### 添加或修改文件关联
468−
469−你可以用`--map-syntax`参数添加或修改文件名模板。它需要一个类似`pattern:syntax`的参数来指定,其中`pattern`是 glob 文件匹配模板,`syntax`则是支持的语法的完整名(使用`bat --list-languages`来查看获取一份清单)。
470−
471−注意:方便起见,你可能需要把参数添加到配置文件,而不是每次都在命令行中传递该参数。
472−
473−以下展示了把“INI”关联到具有`.conf`扩展名的文件
474−
475−```bash
476−--map-syntax='*.conf:INI'
477−```
478−
479−把`.ignore`文件与“Git Ignore”关联
480−
481−```bash
482−--map-syntax='.ignore:Git Ignore'
483−```
484−
485−把`/etc/apache2`内的`.conf`文件关联到“Apache Conf”语法(`bat`已默认绑定)
486−
487−```bash
488−--map-syntax='/etc/apache2/**/*.conf:Apache Conf'
489−```
490−
491−### 使用自定义分页器
492−
493−`bat`默认使用`PAGER`环境变量定义的分页器,如果没有定义则使用`less`。`bat`提供了`BAT_PAGER`环境变量来专为`bat`选择分页器(优先级高于`PAGER`)。
494−
495−注意:当`PAGER`设置为`more`或`most`时,`bat`会使用`less`来代替以确保能提供色彩支持。
496−
497−```bash
498−export BAT_PAGER="less -RF"
499−```
500−
501−除了使用环境变量来改变`bat`使用的的分页器,也可以在配置文件中提供`--pager`参数。
502−
503−注意:`bat`会把部分命令行参数直接传递给分页器:`-R`/`--RAW-CONTROL-CHARS`,`-F`/`--quit-if-one-screen`以及`-X`/`--no-init`(该参数仅适用于高于530版本的`less`)。其中`-R` 参数需要在解释 ANSI 标准颜色时起作用。`-F`则指示`less`在输出内容的垂直尺寸小于终端尺寸时立即退出。当文件内容可以在一个屏幕里完全显示时,就不需要按`q`键退出阅读模式,很方便就是了。`-X`则能修复`-F`在`less`的老版本中的一些bug(代价是不支持鼠标滚轮,但可以用`-R`来取消`quit-if-one-screen`功能。)。
504−
505−### 缩进
506−
507−`bat` 使用四个空格宽的制表符,而不受分页器影响,同时也可以用`--tabs`参数来自定义。
508−
509−注意:通过其他方法针对分页器的制表符设置不会生效(例如通过`bat`的`--pager`参数传递或`less`使用的`LESS`环境变量)。因为在输出提交给分页器之前,内容中的制表符就已经被`bat`替换为了特定长度的空格以避免由于边栏导致的缩进问题。你可以用给`bat`传递`--tabs=0`参数来取消该设定并让分页器自己处理制表符。
510−
511−### 暗色模式
512−
513−如果你用的 macOS 处于暗色模式,你可以为`bat`启用基于系统主题的主题。如下所示操作会让`bat`在系统处于亮色模式时加载`GitHub`主题和暗色模式时加载`default`主题。
514−
515−```bash
516−alias cat="bat --theme=\$(defaults read -globalDomain AppleInterfaceStyle &> /dev/null && echo default || echo GitHub)"
517−```
518−
519−## 配置文件
520−
521−```bash
522−bat --config-file
523−```
524−
525−你也可以用`BAT_CONFIG_PATH`来为`bat`指定自定义位置的配置文件:
526−
527−```bash
528−export BAT_CONFIG_PATH="/path/to/bat.conf"
529−```
530−
531−使用`--generate-config-file`参数调用`bat`会在指定位置生成一份默认的`bat`配置文件:
532−
533−```bash
534−bat --generate-config-file
535−```
536−
537−### 格式
538−
539−配置文件其实是一份按行分割的命令行参数列表。你可以用`bat --help`来查看所有可用的参数和适用的值。配置文件中`#`打头的行会被视为注释而不生效。
540−
541−以下是一份示例:
542−
543−```bash
544−# 设置主题为 TwoDark
545−--theme="TwoDark"
546−
547−# 显示行号和 Git 修改信息, 但没有边框
548−--style="numbers,changes,header"
549−
550−# 在终端中以斜体输出文本(不是所有终端都支持)
551−--italic-text=always
552−
553−# 使用 C++ 语法来给 Ardiuno 的 .ino 文件提供高亮
554−--map-syntax "*.ino:C++"
555−```
556−
557−## 在 Windows 中使用 `bat`
558−
559−`bat` 在 Windows 上开箱即用,除了部分功能需要额外配置。
560−
561−### 前置条件
562−
563−你需要先安装 [Visual C++ Redistributable](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads) 包。
564−
565−### 分页
566−
567−Windows 只有一个提供有限功能的分页器,你可以从[这里下载](http://www.greenwoodsoftware.com/less/download.html)或用 [Chocolatey 安装](https://chocolatey.org/packages/Less) Windows 版本的`less`。第一种方法需要你把它所在目录加入`PATH`环境变量或[定义分页器变量](#使用自定义分页器)
568−
569−### 色彩
570−
571−Windows 10 从 [v1511](https://en.wikipedia.org/wiki/Windows_10_version_history#Version_1511_(November_Update)) 开始 shell(`conhost.exe`,命令提示符或 Powershell)原生支持色彩。在早些版本的 Windows 中你可以用第三方终端如 [Cmder](http://cmder.net/) (使用[ConEmu](https://conemu.github.io/))。
572−
573−注意:Git 和 MSYS 版本的 `less` 没法正确在 Windows 表达色彩。如果你没有安装其他分页器,你可以直接用`--paging=never`或设置`BAT_PAGER`为空字符串来关闭分页功能。
574−
575−### Cygwin
576−
577−Windows 上的`bat`原生不支持 Cygwin' unix-style 路径(`/cygdrive/*`)。当传递一个绝对 cygwin 路径作为参数值时,`bat`会产生`The system cannot find the path specified. (os error 3)`的错误。你可以`.bash_profile`文件中添加以下函数来解决这个问题。
578−
579−```bash
580−bat() {
581− local index
582− local args=("$@")
583− for index in $(seq 0 ${#args[@]}) ; do
584− case "${args[index]}" in
585− -*) continue;;
586− *) [ -e "${args[index]}" ] && args[index]="$(cygpath --windows "${args[index]}")";;
587− esac
588− done
589− command bat "${args[@]}"
590−}
591−```
592−
593−## 疑难解答
594−
595−### 输出内容含糊不清
596−
597−当输入文件包含颜色代码和其他 ANSI 转义符号时,`bat`会产生错误的语法高亮和文本,导致输出看起来令人无法理解。当你需要输出该文件时,请使用`--color=never --wrap=never`参数来关闭上色和文字包裹。
598−
599−### 终端与色彩
600−
601−`bat`会区分支持 truecolor 和不支持 truecolor 的终端。但是大部分语法高亮主题都是用了没有为 8-bit 色彩支持的颜色,因此强烈推荐使用一个支持 24-bit 色彩的终端(`terminator`,`konsole`,`iTerm2`...),或使用一个 [8-bit 主题](#8-bit-主题)来限制一些颜色。查看[这篇文章使用自定义分页器](https://gist.github.com/XVilka/8346728)了解更多支持 truecolor 的终端。你需要定义`COLORTERM`变量为`truecolor`或`24bit`来确保`bat`能够识别终端的对颜色的支持,否则会使用 8 bit 模式。
602−
603−### 行号和边框很难看清
604−
605−试试其他主题,说不定能有所改善(用`bat --list-themes`查看主题列表)。
606−
607−### 文件编码
608−
609−`bat`原生支持 UTF-8 和 UTF-16。至于其他文件你可能需要在使用`bat`之前先把编码转换到UTF-8。
610−
611−这里展示了使用`iconv`来把 Latin-1(ISO-8859-1) 编码的 PHP 文件转换到 UTF-8:
612−
613−```bash
614−iconv -f ISO-8859-1 -t UTF-8 my-file.php | bat
615−```
616−
617−注意: 当`bat`无法识别语言时你可能会需要`-l`/`--language`参数。
618−
619−## Development
620−
621−```bash
622−# Recursive clone to retrieve all submodules
623−git clone --recursive https://github.com/sharkdp/bat
624−
625−# Build (debug version)
626−cd bat
627−cargo build --bins
628−
629−# Run unit tests and integration tests
630−cargo test
631−
632−# Install (release version)
633−cargo install --path . --locked
634−
635−# Build a bat binary with modified syntaxes and themes
636−bash assets/create.sh
637−cargo install --path . --locked --force
638−```
639−
640−If you want to build an application that uses `bat`s pretty-printing
641−features as a library, check out the [the API documentation](https://docs.rs/bat/).
642−Note that you have to use either `regex-onig` or `regex-fancy` as a feature
643−when you depend on `bat` as a library.
644−
645−## Contributing
646−
647−Take a look at the [`CONTRIBUTING.md`](CONTRIBUTING.md) guide.
648−
649−## Maintainers
650−
651−- [sharkdp](https://github.com/sharkdp)
652−- [eth-p](https://github.com/eth-p)
653−- [keith-hall](https://github.com/keith-hall)
654−- [Enselic](https://github.com/Enselic)
655−
656−## Security vulnerabilities
657−
658−Please contact [David Peter](https://david-peter.de/) via email if you want to report a vulnerability in `bat`.
659−
660−## Project goals and alternatives
661−
662−`bat` tries to achieve the following goals:
663−
664−- Provide beautiful, advanced syntax highlighting
665−- Integrate with Git to show file modifications
666−- Be a drop-in replacement for (POSIX) `cat`
667−- Offer a user-friendly command-line interface
668−
669−There are a lot of alternatives, if you are looking for similar programs. See
670−[this document](doc/alternatives.md) for a comparison.
671−
672−## License
673−
674−Copyright (c) 2018-2021 [bat-developers](https://github.com/sharkdp/bat).
675−
676−`bat` is made available under the terms of either the MIT License or the Apache License 2.0, at your option.
677−
678−See the [LICENSE-APACHE](LICENSE-APACHE) and [LICENSE-MIT](LICENSE-MIT) files for license details.
doc/alternatives.md+1−40
@@ -9,7 +9,7 @@ if you are not looking for a program like `bat`, this comparison might not be fo
9| Drop-in `cat` replacement | :heavy_check_mark: [*](https://github.com/sharkdp/bat/issues/134) | :x: | :x: | (:heavy_check_mark:) | :x: | :x: [*](https://github.com/rstacruz/hicat/issues/6) | :x: | :x: |
9| Drop-in `cat` replacement | :heavy_check_mark: [*](https://github.com/sharkdp/bat/issues/134) | :x: | :x: | (:heavy_check_mark:) | :x: | :x: [*](https://github.com/rstacruz/hicat/issues/6) | :x: | :x: |
10| Git integration | :heavy_check_mark: | :x: | :x: | :x: | :x: | :x: | :x: | :x: |
10| Git integration | :heavy_check_mark: | :x: | :x: | :x: | :x: | :x: | :x: | :x: |
11| Automatic paging | :heavy_check_mark: | :x: | :x: | :x: | :x: | :heavy_check_mark: | :x: | :x: |
11| Automatic paging | :heavy_check_mark: | :x: | :x: | :x: | :x: | :heavy_check_mark: | :x: | :x: |
12−| Languages (circa) | 150 | 300 | 200 | 7 | 80 | 130 | 30 | 130 |
12+| Languages (circa) | 110 | 300 | 200 | 7 | 80 | 130 | 30 | 130 |
13| Extensible (languages, themes) | :heavy_check_mark: | (:heavy_check_mark:) | (:heavy_check_mark:) | :x: | (:heavy_check_mark:) | :x: | :x: | :x: |
13| Extensible (languages, themes) | :heavy_check_mark: | (:heavy_check_mark:) | (:heavy_check_mark:) | :x: | (:heavy_check_mark:) | :x: | :x: | :x: |
14| Advanced highlighting (e.g. nested syntaxes) | :heavy_check_mark: | :heavy_check_mark: | (:heavy_check_mark:) ? | :x: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
14| Advanced highlighting (e.g. nested syntaxes) | :heavy_check_mark: | :heavy_check_mark: | (:heavy_check_mark:) ? | :x: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
15| Execution time [ms] (`jquery-3.3.1.js`) | 624 | 789 | 400 | 80 | 300 | 316 | 157 | 695 |
15| Execution time [ms] (`jquery-3.3.1.js`) | 624 | 789 | 400 | 80 | 300 | 316 | 157 | 695 |
@@ -22,42 +22,3 @@ request.
22Some other alternatives that are also related, but not yet included in the table:
22Some other alternatives that are also related, but not yet included in the table:
23- [lesspipe](https://github.com/wofr06/lesspipe)
23- [lesspipe](https://github.com/wofr06/lesspipe)
24- [vimpager](https://github.com/rkitover/vimpager)
24- [vimpager](https://github.com/rkitover/vimpager)
25−
26−## Benchmarks
27−
28−The benchmarks above have been created with this script:
29−```bash
30−#!/usr/bin/env bash
31−
32−cd "$(dirname "${BASH_SOURCE[0]}")" || exit
33−
34−if ! command -v hyperfine > /dev/null 2>&1; then
35− echo "'hyperfine' does not seem to be installed."
36− echo "You can get it here: https://github.com/sharkdp/hyperfine"
37− exit 1
38−fi
39−
40−SRC="test-src/jquery-3.3.1.js"
41−
42−
43−cmd_bat="bat --style=full --color=always --paging=never '$SRC'"
44−cmd_bat_simple="bat --plain --wrap=never --tabs=0 --color=always --paging=never '$SRC'"
45−cmd_pygmentize="pygmentize -g '$SRC'"
46−cmd_highlight="highlight -O truecolor '$SRC'"
47−cmd_ccat="ccat --color=always '$SRC'"
48−cmd_source_highlight="source-highlight --failsafe --infer-lang -f esc -i '$SRC'"
49−cmd_hicat="hicat '$SRC'"
50−cmd_coderay="coderay '$SRC'"
51−cmd_rouge="rougify '$SRC'"
52−
53−hyperfine --warmup 3 \
54− "$cmd_bat" \
55− "$cmd_bat_simple" \
56− "$cmd_pygmentize" \
57− "$cmd_highlight" \
58− "$cmd_ccat" \
59− "$cmd_source_highlight" \
60− "$cmd_hicat" \
61− "$cmd_coderay" \
62− "$cmd_rouge" \
63−```
doc/assets.mddeleted−100
@@ -1,100 +0,0 @@
1−## Adding new builtin languages for syntax highlighting
2−
3−Should you find that a particular syntax is not available within `bat` and think it should be included in `bat` by default, you can follow the instructions outlined below.
4−
5−`bat` uses the excellent [syntect](https://github.com/trishume/syntect) library to highlight source
6−code. As a basis, syntect uses [Sublime Text](https://www.sublimetext.com/) syntax definitions
7−in the `.sublime-syntax` format.
8−
9−**Important:** Before proceeding, verify that the syntax you wish to add meets the [criteria for inclusion](#Criteria-for-inclusion-of-new-syntaxes).
10−
11−1. Find a Sublime Text syntax for the given language, preferably in a separate Git repository
12− which can be included as a submodule (under `assets/syntaxes`) using
13− `git submodule add <https github link> ./assets/syntaxes/02_Extra/<repo name>`, replacing
14− the contents of the angle brackets as appropriate.
15−
16−2. If the Sublime Text syntax is only available as a `.tmLanguage` file, open the file in
17− Sublime Text and convert it to a `.sublime-syntax` file via *Tools* -> *Developer* ->
18− *New Syntax from XXX.tmLanguage...*. Save the new file in the `assets/syntaxes` folder.
19−
20−3. Run the `assets/create.sh` script. It calls `bat cache --build` to parse all available
21− `.sublime-syntax` files and serialize them to a `syntaxes.bin` file.
22−
23−4. Re-compile `bat`. At compilation time, the `syntaxes.bin` file will be stored inside the
24− `bat` binary.
25−
26−5. Use `bat --list-languages` to check if the new languages are available.
27−
28−6. Add a syntax test for the new language. See [below](#Syntax-tests) for details.
29−
30−7. If you send a pull request with your changes, please do *not* include the changed `syntaxes.bin`
31− file. A new binary cache file will be created once before every new release of `bat`. This
32− avoids bloating the repository size unnecessarily.
33−
34−### Syntax tests
35−
36−`bat` has a set of syntax highlighting regression tests in `tests/syntax-tests`. The main idea is
37−make sure that we do not run into issues we had in the past where either (1) syntax highlighting
38−for some language is suddenly not working anymore or (2) `bat` suddenly crashes for some input (due
39−to `regex` incompatibilities between `syntect` and Sublime Text).
40−
41−In order to add a new test file, please follow these steps (let's take "Ruby" as an example):
42−
43−1. Make sure that you are running the **latest version of `bat`** and that `bat` is available on
44− the path. If you are creating a syntax test for a new builtin syntax (see above), make sure that
45− your version of `bat` already has the new syntax builtin.
46−2. Find an example Ruby source file or write one yourself. If possible, the file should aim to be
47− "comprehensive" (i.e. include a lot of the possible syntax), but this is not strictly necessary.
48− A simple file is better than none at all. Also, the files shouldn't be gigantic.
49−3. Save the file in `tests/syntax-tests/source/Ruby` (adapt for your language). The file name could
50− be `test.rb` (adapt extension) but can also be adapted if that is necessary in order for `bat` to
51− highlight it correctly (e.g. `Makefile`).
52−4. If you have copied the file from somewhere else, please make sure that the file *may* be copied
53− under the respective license and that the license is compatible with `bat`s license. If it
54− requires attribution, please add a `LICENSE.md` in the same folder with a text like this:
55− ```
56− The `test.rb` file has been added from [enter source here] under the following license:
57−
58− [add license text here]
59− ```
60−5. Go to `tests/syntax-tests` and run the `update.sh` Bash script. A new file should be generated
61− in the `highlighted` folder (e.g. `highlighted/Ruby/test.rb`).
62−6. Use `cat` or `bat --language=txt` to display the content of this file and make sure that the
63− syntax highlighting looks correct.
64−7. `git add` the new files in the `source` folder as well as the autogenerated files in the
65− `highlighted` folder.
66−
67−### Troubleshooting
68−
69−Make sure that the local cache does not interfere with the internally stored syntaxes and
70−themes (`bat cache --clear`).
71−
72−## Criteria for inclusion of new syntaxes
73−
74−* More than 10,000 downloads at [Package Control](https://packagecontrol.io)
75−
76−### Manual modifications
77−
78−The following files have been manually modified after converting from a `.tmLanguage` file:
79−
80−* `Apache.sublime_syntax`=> removed `.conf` and `.CONF` file types.
81−* `Dart.sublime-syntax` => removed `#regex.dart` include.
82−* `INI.sublime-syntax` => added `.hgrc`, `hgrc`, and `desktop` file types and support for comments after section headers
83−* `Org mode.sublime-syntax` => removed `task` file type.
84−* `SML.sublime_syntax` => removed `ml` file type.
85−* `Robot.sublime_syntax` => changed name to "Robot Framework", added `.resource` extension
86−
87−### Non-submodule additions
88−
89−* `Assembly (x86_64)` has been manually added from https://github.com/13xforever/x86-assembly-textmate-bundle due to `git clone` recursion problems
90−* `Nim.sublime-syntax` has been added manually from https://github.com/getzola/zola/blob/master/sublime_syntaxes/Nim.sublime-syntax as there was no suitable Git repository for it. The original syntax seems to originate from https://github.com/Varriount/NimLime
91−* `Rego.sublime-syntax` has been added manually from https://github.com/open-policy-agent/opa/blob/master/misc/syntax/sublime/rego.sublime-syntax
92− as it is not kept in a standalone repository. The file is generated from
93− https://github.com/open-policy-agent/opa/blob/master/misc/syntax/textmate/Rego.tmLanguage
94−* `SML.sublime_syntax` has been added manually from
95− https://github.com/seanjames777/SML-Language-Definitiona as it is not
96− kept in a standalone repository. The file generated is from
97− https://github.com/seanjames777/SML-Language-Definition/blob/master/sml.tmLanguage
98−* `Cabal.sublime_syntax` has been added manually from
99− https://github.com/SublimeHaskell/SublimeHaskell/ - we don't want to include the whole submodule because it includes other syntaxes ("Haskell improved") as well.
100−* `Lean.sublime-syntax` has been added manually from https://github.com/leanprover/vscode-lean/blob/master/syntaxes/lean.json via conversion.
doc/release-checklist.mddeleted−73
@@ -1,73 +0,0 @@
1−# Release checklist
2−
3−## Version bump
4−
5−- [ ] Update version in `Cargo.toml`. Run `cargo build` to update `Cargo.lock`.
6− Make sure to `git add` the `Cargo.lock` changes as well.
7−- [ ] Find the current min. supported Rust version by running
8− `grep '^\s*MIN_SUPPORTED_RUST_VERSION' .github/workflows/CICD.yml`.
9−- [ ] Update the version and the min. supported Rust version in `README.md` and
10− `doc/README-*.md`. Check with
11− `git grep -i -e 'rust.*1\.' -e '1\..*rust' | grep README | grep -v tests/`.
12−- [ ] Update `CHANGELOG.md`. Introduce a section for the new release.
13−
14−## Update syntaxes and themes (build assets)
15−
16−- [ ] Install the latest master version (`cargo clean && cargo install --locked -f --path .`) and make
17− sure that it is available on the `PATH` (`bat --version` should show the
18− new version).
19−- [ ] Run `assets/create.sh` and check in the binary asset files.
20−
21−## Documentation
22−
23−- [ ] Review `-h`, `--help`, and the `man` page. All of these are shown in
24− the output of the CI job called *Documentation*, so look there.
25− The CI workflow corresponding to the tip of the master branch is a good place to look.
26−
27−## Pre-release checks
28−
29−- [ ] Push all changes and wait for CI to succeed (before continuing with the
30− next section).
31−- [ ] Optional: manually test the new features and command-line options. To do
32− this, install the latest `bat` version again (to include the new syntaxes
33− and themes).
34−- [ ] Run `cargo publish --dry-run` to make sure that it will
35− succeed later (after creating the GitHub release).
36−
37−## Release
38−
39−- [ ] Create a tag and push it: `git tag vX.Y.Z; git push origin tag vX.Y.Z`.
40− This will trigger the deployment via GitHub Actions.
41− REMINDER: If your `origin` is a fork, don't forget to push to e.g. `upstream` instead!
42−- [ ] Go to https://github.com/sharkdp/bat/releases/new to create the new
43− release. Select the new tag and also use it as the release title. For the
44− release notes, copy the corresponding section from `CHANGELOG.md` and
45− possibly add additional remarks for package maintainers.
46− Publish the release.
47−- [ ] Check if the binary deployment works (archives and Debian packages should
48− appear when the CI run for the Git tag has finished).
49−- [ ] Publish to crates.io by running `cargo publish` in a *clean* repository.
50− The safest way to do this is to clone a fresh copy.
51−
52−## Post-release
53−
54−- [ ] Prepare a new "unreleased" section at the top of `CHANGELOG.md`.
55− Put this at the top:
56−
57−```
58−# unreleased
59−
60−## Features
61−
62−## Bugfixes
63−
64−## Other
65−
66−## Syntaxes
67−
68−## Themes
69−
70−## `bat` as a library
71−
72−
73−```
doc/sponsors.mddeleted−14
@@ -1,14 +0,0 @@
1−## Sponsors
2−
3−`bat` development is sponsored by many individuals and companies. Thank you very much!
4−
5−Please note, that being sponsored does not affect the individuality of the `bat`
6−project or affect the maintainers' actions in any way.
7−We remain impartial and continue to assess pull requests solely on merit - the
8−features added, bugs solved, and effect on the overall complexity of the code.
9−No issue will have a different priority based on sponsorship status of the
10−reporter.
11−
12−Contributions from anybody are most welcomed, please see our [`CONTRIBUTING.md`](../CONTRIBUTING.md) guide.
13−
14−If you want to see our biggest sponsors, check the top of [`README.md`](../README.md#sponsors).
doc/sponsors/workos-logo-white-bg.svgdeleted−11
@@ -1,11 +0,0 @@
1−<svg width="1354" height="420" viewBox="0 0 1354 420" fill="none" xmlns="http://www.w3.org/2000/svg">
2−<rect width="1354" height="420" rx="20" fill="white"/>
3−<path d="M434.751 133.122H466.637L489.595 227.729C493.852 245.585 494.697 256.219 494.697 256.219H495.128C495.128 256.219 496.61 245.808 500.867 227.729L522.757 133.122H558.9L582.066 227.729C586.53 246.223 587.598 256.219 587.598 256.219H588.236C588.236 256.219 588.666 246.223 592.907 227.729L615.02 133.122H646.907L606.523 288.313H571.017L546.576 194.344C541.474 173.936 541.044 164.801 541.044 164.801H540.614C540.614 164.801 540.183 173.936 535.512 194.344L512.553 288.313H475.996L434.751 133.122Z" fill="black"/>
4−<path d="M641.583 231.934C641.583 196.428 664.541 173.47 699.202 173.47C733.639 173.47 756.597 196.428 756.597 231.934C756.597 267.647 733.639 290.828 699.202 290.828C664.557 290.812 641.583 267.647 641.583 231.934ZM726.832 231.934C726.832 208.976 715.783 195.998 699.202 195.998C681.346 195.998 671.349 210.458 671.349 231.934C671.349 255.323 682.398 268.284 699.202 268.284C717.058 268.284 726.832 253.824 726.832 231.934Z" fill="black"/>
5−<path d="M770.836 175.21H799.103V196.048H799.741C804.635 185.207 816.322 174.365 836.299 174.365C839.695 174.365 841.831 174.796 843.314 175.21V203.478H842.469C842.469 203.478 839.918 202.633 832.903 202.633C811.013 202.633 799.103 215.594 799.103 239.828V288.295H770.836V175.21Z" fill="black"/>
6−<path d="M856.5 133.122H884.767V182.865C884.767 212.2 884.336 217.509 884.336 217.509H884.767L926.857 175.212H962.139L912.843 224.11L970.031 288.313H936.646L895.401 241.536L884.767 251.946V288.297H856.5V133.122Z" fill="black"/>
7−<path d="M970.444 211.285C970.444 163.455 1000.21 131.569 1044.85 131.569C1089.49 131.569 1119.26 163.455 1119.26 211.285C1119.26 259.114 1089.49 291.001 1044.85 291.001C1000.21 291.001 970.444 259.114 970.444 211.285ZM1088.42 211.285C1088.42 178.761 1071 156.855 1044.84 156.855C1018.67 156.855 1001.26 178.761 1001.26 211.285C1001.26 243.809 1018.69 265.715 1044.84 265.715C1070.98 265.715 1088.42 243.809 1088.42 211.285Z" fill="black"/>
8−<path d="M1130.08 236.656H1162.4C1162.4 254.943 1174.95 265.146 1194.08 265.146C1210.23 265.146 1221.29 257.063 1221.29 245.584C1221.29 232.622 1212.79 229.21 1185.79 223.901C1161.12 219.007 1134.98 210.716 1134.98 178.399C1134.98 151.408 1157.93 131 1193.01 131C1229.57 131 1252.11 150.132 1252.11 179.037H1219.79C1219.79 165.007 1208.95 156.286 1193.01 156.286C1176.86 156.286 1166.86 164.146 1166.86 175.625C1166.86 187.742 1173.88 192.413 1195.56 196.878C1227.65 203.685 1254.02 207.288 1254.02 243.001C1254.02 271.3 1229.36 290.432 1193.01 290.432C1156.02 290.432 1130.08 268.957 1130.08 236.656Z" fill="black"/>
9−<path d="M100 210C100 214.824 101.269 219.647 103.723 223.793L148.231 300.878C152.8 308.747 159.739 315.178 168.369 318.055C185.377 323.724 202.977 316.447 211.354 301.893L222.1 283.278L179.708 210L224.47 132.408L235.216 113.792C238.431 108.208 242.747 103.638 247.824 100H243.17H178.777C166.677 100 155.508 106.431 149.5 116.923L103.723 196.208C101.269 200.354 100 205.177 100 210Z" fill="#6363F1"/>
10−<path d="M353.847 210C353.847 205.177 352.578 200.353 350.124 196.207L305.024 118.107C296.647 103.638 279.047 96.3608 262.039 101.945C253.409 104.822 246.47 111.253 241.901 119.122L231.747 136.638L274.139 210L229.378 287.592L218.632 306.208C215.416 311.708 211.101 316.362 206.024 320H210.678H275.07C287.17 320 298.34 313.569 304.347 303.077L350.124 223.792C352.578 219.646 353.847 214.823 353.847 210Z" fill="#6363F1"/>
11−</svg>
rustfmt.tomldeleted−1
@@ -1 +0,0 @@
1−# Defaults are used
src/assets.rs+241−410
@@ -1,255 +1,203 @@
1+use std::collections::BTreeMap;
1use std::ffi::OsStr;
2use std::ffi::OsStr;
2−use std::fs;
3+use std::fs::{self, File};
4+use std::io::BufReader;
3use std::path::Path;
5use std::path::Path;
4
6
5−use once_cell::unsync::OnceCell;
7+use syntect::dumps::{dump_to_file, from_binary, from_reader};
6−
8+use syntect::highlighting::{Theme, ThemeSet};
7−use syntect::highlighting::Theme;
9+use syntect::parsing::{SyntaxReference, SyntaxSet, SyntaxSetBuilder};
8−use syntect::parsing::{SyntaxReference, SyntaxSet};
9
10
10use path_abs::PathAbs;
11use path_abs::PathAbs;
11
12
13+use crate::assets_metadata::AssetsMetadata;
12use crate::error::*;
14use crate::error::*;
13−use crate::input::{InputReader, OpenedInput};
15+use crate::input::{InputReader, OpenedInput, OpenedInputKind};
14−use crate::syntax_mapping::ignored_suffixes::IgnoredSuffixes;
16+use crate::syntax_mapping::{MappingTarget, SyntaxMapping};
15−use crate::syntax_mapping::MappingTarget;
16−use crate::{bat_warning, SyntaxMapping};
17−
18−use lazy_theme_set::LazyThemeSet;
19−
20−use serialized_syntax_set::*;
21−
22−#[cfg(feature = "build-assets")]
23−pub use crate::assets::build_assets::*;
24−
25−pub(crate) mod assets_metadata;
26−#[cfg(feature = "build-assets")]
27−mod build_assets;
28−mod lazy_theme_set;
29−mod serialized_syntax_set;
30
17
31#[derive(Debug)]
18#[derive(Debug)]
32pub struct HighlightingAssets {
19pub struct HighlightingAssets {
33− syntax_set_cell: OnceCell<SyntaxSet>,
20+ pub(crate) syntax_set: SyntaxSet,
34− serialized_syntax_set: SerializedSyntaxSet,
21+ pub(crate) theme_set: ThemeSet,
35−
36− theme_set: LazyThemeSet,
37 fallback_theme: Option<&'static str>,
22 fallback_theme: Option<&'static str>,
38}
23}
39
24
40−#[derive(Debug)]
25+impl HighlightingAssets {
41−pub struct SyntaxReferenceInSet<'a> {
26+ pub fn default_theme() -> &'static str {
42− pub syntax: &'a SyntaxReference,
27+ "Monokai Extended"
43− pub syntax_set: &'a SyntaxSet,
28+ }
44−}
45
29
46−/// Lazy-loaded syntaxes are already compressed, and we don't want to compress
30+ pub fn from_files(source_dir: &Path, include_integrated_assets: bool) -> Result<Self> {
47−/// already compressed data.
31+ let mut theme_set = if include_integrated_assets {
48−pub(crate) const COMPRESS_SYNTAXES: bool = false;
32+ Self::get_integrated_themeset()
33+ } else {
34+ ThemeSet {
35+ themes: BTreeMap::new(),
36+ }
37+ };
38+
39+ let theme_dir = source_dir.join("themes");
49
40
50−/// We don't want to compress our [LazyThemeSet] since the lazy-loaded themes
41+ let res = theme_set.add_from_folder(&theme_dir);
51−/// within it are already compressed, and compressing another time just makes
42+ if res.is_err() {
52−/// performance suffer
43+ println!(
53−pub(crate) const COMPRESS_THEMES: bool = false;
44+ "No themes were found in '{}', using the default set",
45+ theme_dir.to_string_lossy()
46+ );
47+ }
54
48
55−/// Compress for size of ~40 kB instead of ~200 kB without much difference in
49+ let mut syntax_set_builder = if !include_integrated_assets {
56−/// performance due to lazy-loading
50+ let mut builder = SyntaxSetBuilder::new();
57−pub(crate) const COMPRESS_LAZY_THEMES: bool = true;
51+ builder.add_plain_text_syntax();
52+ builder
53+ } else {
54+ Self::get_integrated_syntaxset().into_builder()
55+ };
58
56
59−/// Compress for size of ~10 kB instead of ~120 kB
57+ let syntax_dir = source_dir.join("syntaxes");
60−pub(crate) const COMPRESS_ACKNOWLEDGEMENTS: bool = true;
58+ if syntax_dir.exists() {
59+ syntax_set_builder.add_from_folder(syntax_dir, true)?;
60+ } else {
61+ println!(
62+ "No syntaxes were found in '{}', using the default set.",
63+ syntax_dir.to_string_lossy()
64+ );
65+ }
61
66
62−impl HighlightingAssets {
67+ Ok(HighlightingAssets {
63− fn new(serialized_syntax_set: SerializedSyntaxSet, theme_set: LazyThemeSet) -> Self {
68+ syntax_set: syntax_set_builder.build(),
64− HighlightingAssets {
65− syntax_set_cell: OnceCell::new(),
66− serialized_syntax_set,
67 theme_set,
69 theme_set,
68 fallback_theme: None,
70 fallback_theme: None,
69− }
71+ })
70 }
72 }
71
73
72− /// The default theme.
74+ pub fn from_cache(cache_path: &Path) -> Result<Self> {
73− ///
75+ let syntax_set_path = cache_path.join("syntaxes.bin");
74− /// ### Windows and Linux
76+ let theme_set_path = cache_path.join("themes.bin");
75− ///
76− /// Windows and most Linux distributions has a dark terminal theme by
77− /// default. On these platforms, this function always returns a theme that
78− /// looks good on a dark background.
79− ///
80− /// ### macOS
81− ///
82− /// On macOS the default terminal background is light, but it is common that
83− /// Dark Mode is active, which makes the terminal background dark. On this
84− /// platform, the default theme depends on
85− /// ```bash
86− /// defaults read -globalDomain AppleInterfaceStyle
87− /// ````
88− /// To avoid the overhead of the check on macOS, simply specify a theme
89− /// explicitly via `--theme`, `BAT_THEME`, or `~/.config/bat`.
90− ///
91− /// See <https://github.com/sharkdp/bat/issues/1746> and
92− /// <https://github.com/sharkdp/bat/issues/1928> for more context.
93− pub fn default_theme() -> &'static str {
94− #[cfg(not(target_os = "macos"))]
95− {
96− Self::default_dark_theme()
97− }
98− #[cfg(target_os = "macos")]
99− {
100− if macos_dark_mode_active() {
101− Self::default_dark_theme()
102− } else {
103− Self::default_light_theme()
104− }
105− }
106− }
107
77
108− /**
78+ let syntax_set_file = File::open(&syntax_set_path).chain_err(|| {
109− * The default theme that looks good on a dark background.
79+ format!(
110− */
80+ "Could not load cached syntax set '{}'",
111− fn default_dark_theme() -> &'static str {
81+ syntax_set_path.to_string_lossy()
112− "Monokai Extended"
82+ )
83+ })?;
84+ let syntax_set: SyntaxSet = from_reader(BufReader::new(syntax_set_file))
85+ .chain_err(|| "Could not parse cached syntax set")?;
86+
87+ let theme_set_file = File::open(&theme_set_path).chain_err(|| {
88+ format!(
89+ "Could not load cached theme set '{}'",
90+ theme_set_path.to_string_lossy()
91+ )
92+ })?;
93+ let theme_set: ThemeSet = from_reader(BufReader::new(theme_set_file))
94+ .chain_err(|| "Could not parse cached theme set")?;
95+
96+ Ok(HighlightingAssets {
97+ syntax_set,
98+ theme_set,
99+ fallback_theme: None,
100+ })
113 }
101 }
114
102
115− /**
103+ fn get_integrated_syntaxset() -> SyntaxSet {
116− * The default theme that looks good on a light background.
104+ from_binary(include_bytes!("../assets/syntaxes.bin"))
117− */
118− #[cfg(target_os = "macos")]
119− fn default_light_theme() -> &'static str {
120− "Monokai Extended Light"
121 }
105 }
122
106
123− pub fn from_cache(cache_path: &Path) -> Result<Self> {
107+ fn get_integrated_themeset() -> ThemeSet {
124− Ok(HighlightingAssets::new(
108+ from_binary(include_bytes!("../assets/themes.bin"))
125− SerializedSyntaxSet::FromFile(cache_path.join("syntaxes.bin")),
126− asset_from_cache(&cache_path.join("themes.bin"), "theme set", COMPRESS_THEMES)?,
127− ))
128 }
109 }
129
110
130 pub fn from_binary() -> Self {
111 pub fn from_binary() -> Self {
131− HighlightingAssets::new(
112+ let syntax_set = Self::get_integrated_syntaxset();
132− SerializedSyntaxSet::FromBinary(get_serialized_integrated_syntaxset()),
113+ let theme_set = Self::get_integrated_themeset();
133− get_integrated_themeset(),
134− )
135− }
136
114
137− pub fn set_fallback_theme(&mut self, theme: &'static str) {
115+ HighlightingAssets {
138− self.fallback_theme = Some(theme);
116+ syntax_set,
117+ theme_set,
118+ fallback_theme: None,
119+ }
139 }
120 }
140
121
141− /// Return the collection of syntect syntax definitions.
122+ pub fn save_to_cache(&self, target_dir: &Path, current_version: &str) -> Result<()> {
142− pub fn get_syntax_set(&self) -> Result<&SyntaxSet> {
123+ let _ = fs::create_dir_all(target_dir);
143− self.syntax_set_cell
124+ let theme_set_path = target_dir.join("themes.bin");
144− .get_or_try_init(|| self.serialized_syntax_set.deserialize())
125+ let syntax_set_path = target_dir.join("syntaxes.bin");
145− }
146
126
147− /// Use [Self::get_syntaxes] instead
127+ print!(
148− #[deprecated]
128+ "Writing theme set to {} ... ",
149− pub fn syntaxes(&self) -> &[SyntaxReference] {
129+ theme_set_path.to_string_lossy()
150− self.get_syntax_set()
130+ );
151− .expect(".syntaxes() is deprecated, use .get_syntaxes() instead")
131+ dump_to_file(&self.theme_set, &theme_set_path).chain_err(|| {
152− .syntaxes()
132+ format!(
133+ "Could not save theme set to {}",
134+ theme_set_path.to_string_lossy()
135+ )
136+ })?;
137+ println!("okay");
138+
139+ print!(
140+ "Writing syntax set to {} ... ",
141+ syntax_set_path.to_string_lossy()
142+ );
143+ dump_to_file(&self.syntax_set, &syntax_set_path).chain_err(|| {
144+ format!(
145+ "Could not save syntax set to {}",
146+ syntax_set_path.to_string_lossy()
147+ )
148+ })?;
149+ println!("okay");
150+
151+ print!(
152+ "Writing metadata to folder {} ... ",
153+ target_dir.to_string_lossy()
154+ );
155+ AssetsMetadata::new(current_version).save_to_folder(target_dir)?;
156+ println!("okay");
157+
158+ Ok(())
153 }
159 }
154
160
155− pub fn get_syntaxes(&self) -> Result<&[SyntaxReference]> {
161+ pub fn set_fallback_theme(&mut self, theme: &'static str) {
156− Ok(self.get_syntax_set()?.syntaxes())
162+ self.fallback_theme = Some(theme);
157 }
163 }
158
164
159− fn get_theme_set(&self) -> &LazyThemeSet {
165+ pub fn syntaxes(&self) -> &[SyntaxReference] {
160− &self.theme_set
166+ self.syntax_set.syntaxes()
161 }
167 }
162
168
163 pub fn themes(&self) -> impl Iterator<Item = &str> {
169 pub fn themes(&self) -> impl Iterator<Item = &str> {
164− self.get_theme_set().themes()
170+ self.theme_set.themes.keys().map(|s| s.as_ref())
165 }
171 }
166
172
167− /// Use [Self::get_syntax_for_path] instead
168− #[deprecated]
169 pub fn syntax_for_file_name(
173 pub fn syntax_for_file_name(
170 &self,
174 &self,
171 file_name: impl AsRef<Path>,
175 file_name: impl AsRef<Path>,
172 mapping: &SyntaxMapping,
176 mapping: &SyntaxMapping,
173 ) -> Option<&SyntaxReference> {
177 ) -> Option<&SyntaxReference> {
174− self.get_syntax_for_path(file_name, mapping)
178+ let file_name = file_name.as_ref();
175− .ok()
179+ match mapping.get_syntax_for(file_name) {
176− .map(|syntax_in_set| syntax_in_set.syntax)
180+ Some(MappingTarget::MapToUnknown) => None,
177− }
181+ Some(MappingTarget::MapTo(syntax_name)) => {
178−
182+ self.syntax_set.find_syntax_by_name(syntax_name)
179− /// Detect the syntax based on, in order:
180− /// 1. Syntax mappings with [MappingTarget::MapTo] and [MappingTarget::MapToUnknown]
181− /// (e.g. `/etc/profile` -> `Bourne Again Shell (bash)`)
182− /// 2. The file name (e.g. `Dockerfile`)
183− /// 3. Syntax mappings with [MappingTarget::MapExtensionToUnknown]
184− /// (e.g. `*.conf`)
185− /// 4. The file name extension (e.g. `.rs`)
186− ///
187− /// When detecting syntax based on syntax mappings, the full path is taken
188− /// into account. When detecting syntax based on file name, no regard is
189− /// taken to the path of the file. Only the file name itself matters. When
190− /// detecting syntax based on file name extension, only the file name
191− /// extension itself matters.
192− ///
193− /// Returns [Error::UndetectedSyntax] if it was not possible detect syntax
194− /// based on path/file name/extension (or if the path was mapped to
195− /// [MappingTarget::MapToUnknown] or [MappingTarget::MapExtensionToUnknown]).
196− /// In this case it is appropriate to fall back to other methods to detect
197− /// syntax. Such as using the contents of the first line of the file.
198− ///
199− /// Returns [Error::UnknownSyntax] if a syntax mapping exist, but the mapped
200− /// syntax does not exist.
201− pub fn get_syntax_for_path(
202− &self,
203− path: impl AsRef<Path>,
204− mapping: &SyntaxMapping,
205− ) -> Result<SyntaxReferenceInSet> {
206− let path = path.as_ref();
207−
208− let syntax_match = mapping.get_syntax_for(path);
209−
210− if let Some(MappingTarget::MapToUnknown) = syntax_match {
211− return Err(Error::UndetectedSyntax(path.to_string_lossy().into()));
212− }
213−
214− if let Some(MappingTarget::MapTo(syntax_name)) = syntax_match {
215− return self
216− .find_syntax_by_name(syntax_name)?
217− .ok_or_else(|| Error::UnknownSyntax(syntax_name.to_owned()));
218− }
219−
220− let file_name = path.file_name().unwrap_or_default();
221−
222− match (
223− self.get_syntax_for_file_name(file_name, &mapping.ignored_suffixes)?,
224− syntax_match,
225− ) {
226− (Some(syntax), _) => Ok(syntax),
227−
228− (_, Some(MappingTarget::MapExtensionToUnknown)) => {
229− Err(Error::UndetectedSyntax(path.to_string_lossy().into()))
230 }
183 }
231−
184+ None => self.get_extension_syntax(file_name.as_os_str()),
232− _ => self
233− .get_syntax_for_file_extension(file_name, &mapping.ignored_suffixes)?
234− .ok_or_else(|| Error::UndetectedSyntax(path.to_string_lossy().into())),
235 }
185 }
236 }
186 }
237
187
238− /// Look up a syntect theme by name.
188+ pub(crate) fn get_theme(&self, theme: &str) -> &Theme {
239− pub fn get_theme(&self, theme: &str) -> &Theme {
189+ match self.theme_set.themes.get(theme) {
240− match self.get_theme_set().get(theme) {
241 Some(theme) => theme,
190 Some(theme) => theme,
242 None => {
191 None => {
243− if theme == "ansi-light" || theme == "ansi-dark" {
192+ if theme != "" {
244− bat_warning!("Theme '{}' is deprecated, using 'ansi' instead.", theme);
193+ use ansi_term::Colour::Yellow;
245− return self.get_theme("ansi");
194+ eprintln!(
195+ "{}: Unknown theme '{}', using default.",
196+ Yellow.paint("[bat warning]"),
197+ theme
198+ );
246 }
199 }
247− if !theme.is_empty() {
200+ &self.theme_set.themes[self.fallback_theme.unwrap_or_else(|| Self::default_theme())]
248− bat_warning!("Unknown theme '{}', using default.", theme)
249− }
250− self.get_theme_set()
251− .get(self.fallback_theme.unwrap_or_else(Self::default_theme))
252− .expect("something is very wrong if the default theme is missing")
253 }
201 }
254 }
202 }
255 }
203 }
@@ -259,153 +207,78 @@ impl HighlightingAssets {
259 language: Option<&str>,
207 language: Option<&str>,
260 input: &mut OpenedInput,
208 input: &mut OpenedInput,
261 mapping: &SyntaxMapping,
209 mapping: &SyntaxMapping,
262− ) -> Result<SyntaxReferenceInSet> {
210+ ) -> Result<&SyntaxReference> {
263 if let Some(language) = language {
211 if let Some(language) = language {
264− let syntax_set = self.get_syntax_set()?;
212+ self.syntax_set
265− return syntax_set
266 .find_syntax_by_token(language)
213 .find_syntax_by_token(language)
267− .map(|syntax| SyntaxReferenceInSet { syntax, syntax_set })
214+ .ok_or_else(|| ErrorKind::UnknownSyntax(language.to_owned()).into())
268− .ok_or_else(|| Error::UnknownSyntax(language.to_owned()));
269− }
270−
271− let path = input.path();
272− let path_syntax = if let Some(path) = path {
273− self.get_syntax_for_path(
274− PathAbs::new(path).map_or_else(|_| path.to_owned(), |p| p.as_path().to_path_buf()),
275− mapping,
276− )
277 } else {
215 } else {
278− Err(Error::UndetectedSyntax("[unknown]".into()))
216+ let line_syntax = self.get_first_line_syntax(&mut input.reader);
279− };
217+
280−
218+ // Get the path of the file:
281− match path_syntax {
219+ // If this was set by the metadata, that will take priority.
282− // If a path wasn't provided, or if path based syntax detection
220+ // If it wasn't, it will use the real file path (if available).
283− // above failed, we fall back to first-line syntax detection.
221+ let path_str =
284− Err(Error::UndetectedSyntax(path)) => self
222+ input
285− .get_first_line_syntax(&mut input.reader)?
223+ .metadata
286− .ok_or(Error::UndetectedSyntax(path)),
224+ .user_provided_name
287− _ => path_syntax,
225+ .as_ref()
288− }
226+ .or_else(|| match input.kind {
289− }
227+ OpenedInputKind::OrdinaryFile(ref path) => Some(path),
290−
228+ _ => None,
291− pub(crate) fn find_syntax_by_name(
229+ });
292− &self,
230+
293− syntax_name: &str,
231+ if let Some(path_str) = path_str {
294− ) -> Result<Option<SyntaxReferenceInSet>> {
232+ // If a path was provided, we try and detect the syntax based on extension mappings.
295− let syntax_set = self.get_syntax_set()?;
233+ let path = Path::new(path_str);
296− Ok(syntax_set
234+ let absolute_path = PathAbs::new(path)
297− .find_syntax_by_name(syntax_name)
235+ .ok()
298− .map(|syntax| SyntaxReferenceInSet { syntax, syntax_set }))
236+ .map(|p| p.as_path().to_path_buf())
299− }
237+ .unwrap_or_else(|| path.to_owned());
300−
238+
301− fn find_syntax_by_extension(&self, e: Option<&OsStr>) -> Result<Option<SyntaxReferenceInSet>> {
239+ match mapping.get_syntax_for(absolute_path) {
302− let syntax_set = self.get_syntax_set()?;
240+ Some(MappingTarget::MapToUnknown) => line_syntax.ok_or_else(|| {
303− let extension = e.and_then(|x| x.to_str()).unwrap_or_default();
241+ ErrorKind::UndetectedSyntax(path.to_string_lossy().into()).into()
304− Ok(syntax_set
242+ }),
305− .find_syntax_by_extension(extension)
243+
306− .map(|syntax| SyntaxReferenceInSet { syntax, syntax_set }))
244+ Some(MappingTarget::MapTo(syntax_name)) => self
307− }
245+ .syntax_set
308−
246+ .find_syntax_by_name(syntax_name)
309− fn get_syntax_for_file_name(
247+ .ok_or_else(|| ErrorKind::UnknownSyntax(syntax_name.to_owned()).into()),
310− &self,
248+
311− file_name: &OsStr,
249+ None => {
312− ignored_suffixes: &IgnoredSuffixes,
250+ let file_name = path.file_name().unwrap_or_default();
313− ) -> Result<Option<SyntaxReferenceInSet>> {
251+ self.get_extension_syntax(file_name)
314− let mut syntax = self.find_syntax_by_extension(Some(file_name))?;
252+ .or(line_syntax)
315− if syntax.is_none() {
253+ .ok_or_else(|| {
316− syntax =
254+ ErrorKind::UndetectedSyntax(path.to_string_lossy().into()).into()
317− ignored_suffixes.try_with_stripped_suffix(file_name, |stripped_file_name| {
255+ })
318− // Note: recursion
256+ }
319− self.get_syntax_for_file_name(stripped_file_name, ignored_suffixes)
257+ }
320− })?;
258+ } else {
259+ // If a path wasn't provided, we fall back to the detect first-line syntax.
260+ line_syntax.ok_or_else(|| ErrorKind::UndetectedSyntax("[unknown]".into()).into())
261+ }
321 }
262 }
322− Ok(syntax)
323 }
263 }
324
264
325− fn get_syntax_for_file_extension(
265+ fn get_extension_syntax(&self, file_name: &OsStr) -> Option<&SyntaxReference> {
326− &self,
266+ self.syntax_set
327− file_name: &OsStr,
267+ .find_syntax_by_extension(file_name.to_str().unwrap_or_default())
328− ignored_suffixes: &IgnoredSuffixes,
268+ .or_else(|| {
329− ) -> Result<Option<SyntaxReferenceInSet>> {
269+ self.syntax_set.find_syntax_by_extension(
330− let mut syntax = self.find_syntax_by_extension(Path::new(file_name).extension())?;
270+ Path::new(file_name)
331− if syntax.is_none() {
271+ .extension()
332− syntax =
272+ .and_then(|x| x.to_str())
333− ignored_suffixes.try_with_stripped_suffix(file_name, |stripped_file_name| {
273+ .unwrap_or_default(),
334− // Note: recursion
274+ )
335− self.get_syntax_for_file_extension(stripped_file_name, ignored_suffixes)
275+ })
336− })?;
337− }
338− Ok(syntax)
339 }
276 }
340
277
341− fn get_first_line_syntax(
278+ fn get_first_line_syntax(&self, reader: &mut InputReader) -> Option<&SyntaxReference> {
342− &self,
279+ String::from_utf8(reader.first_line.clone())
343− reader: &mut InputReader,
344− ) -> Result<Option<SyntaxReferenceInSet>> {
345− let syntax_set = self.get_syntax_set()?;
346− Ok(String::from_utf8(reader.first_line.clone())
347 .ok()
280 .ok()
348− .and_then(|l| syntax_set.find_syntax_by_first_line(&l))
281+ .and_then(|l| self.syntax_set.find_syntax_by_first_line(&l))
349− .map(|syntax| SyntaxReferenceInSet { syntax, syntax_set }))
350− }
351−}
352−
353−pub(crate) fn get_serialized_integrated_syntaxset() -> &'static [u8] {
354− include_bytes!("../assets/syntaxes.bin")
355−}
356−
357−pub(crate) fn get_integrated_themeset() -> LazyThemeSet {
358− from_binary(include_bytes!("../assets/themes.bin"), COMPRESS_THEMES)
359−}
360−
361−pub fn get_acknowledgements() -> String {
362− from_binary(
363− include_bytes!("../assets/acknowledgements.bin"),
364− COMPRESS_ACKNOWLEDGEMENTS,
365− )
366−}
367−
368−pub(crate) fn from_binary<T: serde::de::DeserializeOwned>(v: &[u8], compressed: bool) -> T {
369− asset_from_contents(v, "n/a", compressed)
370− .expect("data integrated in binary is never faulty, but make sure `compressed` is in sync!")
371−}
372−
373−fn asset_from_contents<T: serde::de::DeserializeOwned>(
374− contents: &[u8],
375− description: &str,
376− compressed: bool,
377−) -> Result<T> {
378− if compressed {
379− bincode::deserialize_from(flate2::read::ZlibDecoder::new(contents))
380− } else {
381− bincode::deserialize_from(contents)
382− }
383− .map_err(|_| format!("Could not parse {}", description).into())
384−}
385−
386−fn asset_from_cache<T: serde::de::DeserializeOwned>(
387− path: &Path,
388− description: &str,
389− compressed: bool,
390−) -> Result<T> {
391− let contents = fs::read(path).map_err(|_| {
392− format!(
393− "Could not load cached {} '{}'",
394− description,
395− path.to_string_lossy()
396− )
397− })?;
398− asset_from_contents(&contents[..], description, compressed)
399− .map_err(|_| format!("Could not parse cached {}", description).into())
400−}
401−
402−#[cfg(target_os = "macos")]
403−fn macos_dark_mode_active() -> bool {
404− let mut defaults_cmd = std::process::Command::new("defaults");
405− defaults_cmd.args(&["read", "-globalDomain", "AppleInterfaceStyle"]);
406− match defaults_cmd.output() {
407− Ok(output) => output.stdout == b"Dark\n",
408− Err(_) => true,
409 }
282 }
410}
283}
411
284
@@ -416,8 +289,8 @@ mod tests {
416 use std::ffi::OsStr;
289 use std::ffi::OsStr;
417
290
418 use std::fs::File;
291 use std::fs::File;
419− use std::io::{BufReader, Write};
292+ use std::io::Write;
420− use tempfile::TempDir;
293+ use tempdir::TempDir;
421
294
422 use crate::input::Input;
295 use crate::input::Input;
423
296
@@ -432,22 +305,11 @@ mod tests {
432 SyntaxDetectionTest {
305 SyntaxDetectionTest {
433 assets: HighlightingAssets::from_binary(),
306 assets: HighlightingAssets::from_binary(),
434 syntax_mapping: SyntaxMapping::builtin(),
307 syntax_mapping: SyntaxMapping::builtin(),
435− temp_dir: TempDir::new().expect("creation of temporary directory"),
308+ temp_dir: TempDir::new("bat_syntax_detection_tests")
309+ .expect("creation of temporary directory"),
436 }
310 }
437 }
311 }
438
312
439− fn get_syntax_name(
440− &self,
441− language: Option<&str>,
442− input: &mut OpenedInput,
443− mapping: &SyntaxMapping,
444− ) -> String {
445− self.assets
446− .get_syntax(language, input, mapping)
447− .map(|syntax_in_set| syntax_in_set.syntax.name.clone())
448− .unwrap_or_else(|_| "!no syntax!".to_owned())
449− }
450−
451 fn syntax_for_real_file_with_content_os(
313 fn syntax_for_real_file_with_content_os(
452 &self,
314 &self,
453 file_name: &OsStr,
315 file_name: &OsStr,
@@ -459,21 +321,29 @@ mod tests {
459 writeln!(temp_file, "{}", first_line).unwrap();
321 writeln!(temp_file, "{}", first_line).unwrap();
460 }
322 }
461
323
462− let input = Input::ordinary_file(&file_path);
324+ let input = Input::ordinary_file(file_path.as_os_str());
463 let dummy_stdin: &[u8] = &[];
325 let dummy_stdin: &[u8] = &[];
464− let mut opened_input = input.open(dummy_stdin, None).unwrap();
326+ let mut opened_input = input.open(dummy_stdin).unwrap();
465
327
466− self.get_syntax_name(None, &mut opened_input, &self.syntax_mapping)
328+ self.assets
329+ .get_syntax(None, &mut opened_input, &self.syntax_mapping)
330+ .unwrap_or_else(|_| self.assets.syntax_set.find_syntax_plain_text())
331+ .name
332+ .clone()
467 }
333 }
468
334
469 fn syntax_for_file_with_content_os(&self, file_name: &OsStr, first_line: &str) -> String {
335 fn syntax_for_file_with_content_os(&self, file_name: &OsStr, first_line: &str) -> String {
470 let file_path = self.temp_dir.path().join(file_name);
336 let file_path = self.temp_dir.path().join(file_name);
471 let input = Input::from_reader(Box::new(BufReader::new(first_line.as_bytes())))
337 let input = Input::from_reader(Box::new(BufReader::new(first_line.as_bytes())))
472− .with_name(Some(&file_path));
338+ .with_name(Some(file_path.as_os_str()));
473 let dummy_stdin: &[u8] = &[];
339 let dummy_stdin: &[u8] = &[];
474− let mut opened_input = input.open(dummy_stdin, None).unwrap();
340+ let mut opened_input = input.open(dummy_stdin).unwrap();
475
341
476− self.get_syntax_name(None, &mut opened_input, &self.syntax_mapping)
342+ self.assets
343+ .get_syntax(None, &mut opened_input, &self.syntax_mapping)
344+ .unwrap_or_else(|_| self.assets.syntax_set.find_syntax_plain_text())
345+ .name
346+ .clone()
477 }
347 }
478
348
479 #[cfg(unix)]
349 #[cfg(unix)]
@@ -490,10 +360,14 @@ mod tests {
490 }
360 }
491
361
492 fn syntax_for_stdin_with_content(&self, file_name: &str, content: &[u8]) -> String {
362 fn syntax_for_stdin_with_content(&self, file_name: &str, content: &[u8]) -> String {
493− let input = Input::stdin().with_name(Some(file_name));
363+ let input = Input::stdin().with_name(Some(OsStr::new(file_name)));
494− let mut opened_input = input.open(content, None).unwrap();
364+ let mut opened_input = input.open(content).unwrap();
495
365
496− self.get_syntax_name(None, &mut opened_input, &self.syntax_mapping)
366+ self.assets
367+ .get_syntax(None, &mut opened_input, &self.syntax_mapping)
368+ .unwrap_or_else(|_| self.assets.syntax_set.find_syntax_plain_text())
369+ .name
370+ .clone()
497 }
371 }
498
372
499 fn syntax_is_same_for_inputkinds(&self, file_name: &str, content: &str) -> bool {
373 fn syntax_is_same_for_inputkinds(&self, file_name: &str, content: &str) -> bool {
@@ -570,7 +444,6 @@ mod tests {
570 assert_eq!(test.syntax_for_file("test.sass"), "Sass");
444 assert_eq!(test.syntax_for_file("test.sass"), "Sass");
571 assert_eq!(test.syntax_for_file("test.js"), "JavaScript (Babel)");
445 assert_eq!(test.syntax_for_file("test.js"), "JavaScript (Babel)");
572 assert_eq!(test.syntax_for_file("test.fs"), "F#");
446 assert_eq!(test.syntax_for_file("test.fs"), "F#");
573− assert_eq!(test.syntax_for_file("test.v"), "Verilog");
574 }
447 }
575
448
576 #[test]
449 #[test]
@@ -603,58 +476,13 @@ mod tests {
603 }
476 }
604
477
605 #[test]
478 #[test]
606− fn syntax_detection_with_extension_mapping_to_unknown() {
479+ fn syntax_detection_is_case_sensitive() {
607 let mut test = SyntaxDetectionTest::new();
480 let mut test = SyntaxDetectionTest::new();
608
481
609− // Normally, a CMakeLists.txt file shall use the CMake syntax, even if it is
482+ assert_ne!(test.syntax_for_file("README.MD"), "Markdown");
610− // a bash script in disguise
611− assert_eq!(
612− test.syntax_for_file_with_content("CMakeLists.txt", "#!/bin/bash"),
613− "CMake"
614− );
615−
616− // Other .txt files shall use the Plain Text syntax
617− assert_eq!(
618− test.syntax_for_file_with_content("some-other.txt", "#!/bin/bash"),
619− "Plain Text"
620− );
621−
622− // If we setup MapExtensionToUnknown on *.txt, the match on the full
623− // file name of "CMakeLists.txt" shall have higher prio, and CMake shall
624− // still be used for it
625− test.syntax_mapping
626− .insert("*.txt", MappingTarget::MapExtensionToUnknown)
627− .ok();
628− assert_eq!(
629− test.syntax_for_file_with_content("CMakeLists.txt", "#!/bin/bash"),
630− "CMake"
631− );
632−
633− // However, for *other* files with a .txt extension, first-line fallback
634− // shall now be used
635− assert_eq!(
636− test.syntax_for_file_with_content("some-other.txt", "#!/bin/bash"),
637− "Bourne Again Shell (bash)"
638− );
639− }
640−
641− #[test]
642− fn syntax_detection_is_case_insensitive() {
643− let mut test = SyntaxDetectionTest::new();
644−
645− assert_eq!(test.syntax_for_file("README.md"), "Markdown");
646− assert_eq!(test.syntax_for_file("README.mD"), "Markdown");
647− assert_eq!(test.syntax_for_file("README.Md"), "Markdown");
648− assert_eq!(test.syntax_for_file("README.MD"), "Markdown");
649−
650− // Adding a mapping for "MD" in addition to "md" should not break the mapping
651 test.syntax_mapping
483 test.syntax_mapping
652 .insert("*.MD", MappingTarget::MapTo("Markdown"))
484 .insert("*.MD", MappingTarget::MapTo("Markdown"))
653 .ok();
485 .ok();
654−
655− assert_eq!(test.syntax_for_file("README.md"), "Markdown");
656− assert_eq!(test.syntax_for_file("README.mD"), "Markdown");
657− assert_eq!(test.syntax_for_file("README.Md"), "Markdown");
658 assert_eq!(test.syntax_for_file("README.MD"), "Markdown");
486 assert_eq!(test.syntax_for_file("README.MD"), "Markdown");
659 }
487 }
660
488
@@ -687,12 +515,15 @@ mod tests {
687 .expect("creation of directory succeeds");
515 .expect("creation of directory succeeds");
688 symlink(&file_path, &file_path_symlink).expect("creation of symbolic link succeeds");
516 symlink(&file_path, &file_path_symlink).expect("creation of symbolic link succeeds");
689
517
690− let input = Input::ordinary_file(&file_path_symlink);
518+ let input = Input::ordinary_file(file_path_symlink.as_os_str());
691 let dummy_stdin: &[u8] = &[];
519 let dummy_stdin: &[u8] = &[];
692− let mut opened_input = input.open(dummy_stdin, None).unwrap();
520+ let mut opened_input = input.open(dummy_stdin).unwrap();
693
521
694 assert_eq!(
522 assert_eq!(
695− test.get_syntax_name(None, &mut opened_input, &test.syntax_mapping),
523+ test.assets
524+ .get_syntax(None, &mut opened_input, &test.syntax_mapping)
525+ .unwrap_or_else(|_| test.assets.syntax_set.find_syntax_plain_text())
526+ .name,
696 "SSH Config"
527 "SSH Config"
697 );
528 );
698 }
529 }
src/assets/build_assets.rsdeleted−176
@@ -1,176 +0,0 @@
1−use std::convert::TryInto;
2−use std::path::Path;
3−
4−use syntect::highlighting::ThemeSet;
5−use syntect::parsing::{SyntaxSet, SyntaxSetBuilder};
6−
7−use crate::assets::*;
8−use acknowledgements::build_acknowledgements;
9−
10−mod acknowledgements;
11−
12−pub fn build(
13− source_dir: &Path,
14− include_integrated_assets: bool,
15− include_acknowledgements: bool,
16− target_dir: &Path,
17− current_version: &str,
18−) -> Result<()> {
19− let theme_set = build_theme_set(source_dir, include_integrated_assets)?;
20−
21− let syntax_set_builder = build_syntax_set_builder(source_dir, include_integrated_assets)?;
22−
23− let syntax_set = syntax_set_builder.build();
24−
25− let acknowledgements = build_acknowledgements(source_dir, include_acknowledgements)?;
26−
27− print_unlinked_contexts(&syntax_set);
28−
29− write_assets(
30− &theme_set,
31− &syntax_set,
32− &acknowledgements,
33− target_dir,
34− current_version,
35− )
36−}
37−
38−fn build_theme_set(source_dir: &Path, include_integrated_assets: bool) -> Result<LazyThemeSet> {
39− let mut theme_set = if include_integrated_assets {
40− crate::assets::get_integrated_themeset().try_into()?
41− } else {
42− ThemeSet::new()
43− };
44−
45− let theme_dir = source_dir.join("themes");
46− if theme_dir.exists() {
47− let res = theme_set.add_from_folder(&theme_dir);
48− if let Err(err) = res {
49− println!(
50− "Failed to load one or more themes from '{}' (reason: '{}')",
51− theme_dir.to_string_lossy(),
52− err,
53− );
54− }
55− } else {
56− println!(
57− "No themes were found in '{}', using the default set",
58− theme_dir.to_string_lossy()
59− );
60− }
61−
62− theme_set.try_into()
63−}
64−
65−fn build_syntax_set_builder(
66− source_dir: &Path,
67− include_integrated_assets: bool,
68−) -> Result<SyntaxSetBuilder> {
69− let mut syntax_set_builder = if !include_integrated_assets {
70− let mut builder = syntect::parsing::SyntaxSetBuilder::new();
71− builder.add_plain_text_syntax();
72− builder
73− } else {
74− from_binary::<SyntaxSet>(get_serialized_integrated_syntaxset(), COMPRESS_SYNTAXES)
75− .into_builder()
76− };
77−
78− let syntax_dir = source_dir.join("syntaxes");
79− if syntax_dir.exists() {
80− syntax_set_builder.add_from_folder(syntax_dir, true)?;
81− } else {
82− println!(
83− "No syntaxes were found in '{}', using the default set.",
84− syntax_dir.to_string_lossy()
85− );
86− }
87−
88− Ok(syntax_set_builder)
89−}
90−
91−fn print_unlinked_contexts(syntax_set: &SyntaxSet) {
92− let missing_contexts = syntax_set.find_unlinked_contexts();
93− if !missing_contexts.is_empty() {
94− println!("Some referenced contexts could not be found!");
95− for context in missing_contexts {
96− println!("- {}", context);
97− }
98− }
99−}
100−
101−fn write_assets(
102− theme_set: &LazyThemeSet,
103− syntax_set: &SyntaxSet,
104− acknowledgements: &Option<String>,
105− target_dir: &Path,
106− current_version: &str,
107−) -> Result<()> {
108− let _ = std::fs::create_dir_all(target_dir);
109− asset_to_cache(
110− theme_set,
111− &target_dir.join("themes.bin"),
112− "theme set",
113− COMPRESS_THEMES,
114− )?;
115− asset_to_cache(
116− syntax_set,
117− &target_dir.join("syntaxes.bin"),
118− "syntax set",
119− COMPRESS_SYNTAXES,
120− )?;
121−
122− if let Some(acknowledgements) = acknowledgements {
123− asset_to_cache(
124− acknowledgements,
125− &target_dir.join("acknowledgements.bin"),
126− "acknowledgements",
127− COMPRESS_ACKNOWLEDGEMENTS,
128− )?;
129− }
130−
131− print!(
132− "Writing metadata to folder {} ... ",
133− target_dir.to_string_lossy()
134− );
135− crate::assets_metadata::AssetsMetadata::new(current_version).save_to_folder(target_dir)?;
136− println!("okay");
137−
138− Ok(())
139−}
140−
141−pub(crate) fn asset_to_contents<T: serde::Serialize>(
142− asset: &T,
143− description: &str,
144− compressed: bool,
145−) -> Result<Vec<u8>> {
146− let mut contents = vec![];
147− if compressed {
148− bincode::serialize_into(
149− flate2::write::ZlibEncoder::new(&mut contents, flate2::Compression::best()),
150− asset,
151− )
152− } else {
153− bincode::serialize_into(&mut contents, asset)
154− }
155− .map_err(|_| format!("Could not serialize {}", description))?;
156− Ok(contents)
157−}
158−
159−fn asset_to_cache<T: serde::Serialize>(
160− asset: &T,
161− path: &Path,
162− description: &str,
163− compressed: bool,
164−) -> Result<()> {
165− print!("Writing {} to {} ... ", description, path.to_string_lossy());
166− let contents = asset_to_contents(asset, description, compressed)?;
167− std::fs::write(path, &contents[..]).map_err(|_| {
168− format!(
169− "Could not save {} to {}",
170− description,
171− path.to_string_lossy()
172− )
173− })?;
174− println!("okay");
175− Ok(())
176−}
src/assets/build_assets/acknowledgements.rsdeleted−222
@@ -1,222 +0,0 @@
1−use std::fs::read_to_string;
2−use std::path::{Path, PathBuf};
3−
4−use walkdir::DirEntry;
5−
6−use crate::error::*;
7−
8−struct PathAndStem {
9− path: PathBuf,
10− stem: String,
11− relative_path: String,
12−}
13−
14−/// Looks for LICENSE and NOTICE files in `source_dir`, does some rudimentary
15−/// analysis, and compiles them together in a single string that is meant to be
16−/// used in the output to `--acknowledgements`
17−pub fn build_acknowledgements(
18− source_dir: &Path,
19− include_acknowledgements: bool,
20−) -> Result<Option<String>> {
21− if !include_acknowledgements {
22− return Ok(None);
23− }
24−
25− let mut acknowledgements = format!("{}\n\n", include_str!("../../../NOTICE"));
26−
27− // Sort entries so the order is stable over time
28− let entries = walkdir::WalkDir::new(source_dir).sort_by(|a, b| a.path().cmp(b.path()));
29− for path_and_stem in entries
30− .into_iter()
31− .flatten()
32− .flat_map(|entry| to_path_and_stem(source_dir, entry))
33− {
34− if let Some(license_text) = handle_file(&path_and_stem)? {
35− append_to_acknowledgements(
36− &mut acknowledgements,
37− &path_and_stem.relative_path,
38− &license_text,
39− )
40− }
41− }
42−
43− Ok(Some(acknowledgements))
44−}
45−
46−fn to_path_and_stem(source_dir: &Path, entry: DirEntry) -> Option<PathAndStem> {
47− let path = entry.path();
48−
49− Some(PathAndStem {
50− path: path.to_owned(),
51− stem: path.file_stem().map(|s| s.to_string_lossy().to_string())?,
52− relative_path: path
53− .strip_prefix(source_dir)
54− .map(|p| p.to_string_lossy().to_string())
55− .ok()?,
56− })
57−}
58−
59−fn handle_file(path_and_stem: &PathAndStem) -> Result<Option<String>> {
60− if path_and_stem.stem == "NOTICE" {
61− handle_notice(&path_and_stem.path)
62− } else if path_and_stem.stem.to_ascii_uppercase() == "LICENSE" {
63− handle_license(&path_and_stem.path)
64− } else {
65− Ok(None)
66− }
67−}
68−
69−fn handle_notice(path: &Path) -> Result<Option<String>> {
70− // Assume NOTICE as defined by Apache License 2.0. These must be part of acknowledgements.
71− Ok(Some(read_to_string(path)?))
72−}
73−
74−fn handle_license(path: &Path) -> Result<Option<String>> {
75− let license_text = read_to_string(path)?;
76−
77− if include_license_in_acknowledgments(&license_text) {
78− Ok(Some(license_text))
79− } else if license_not_needed_in_acknowledgements(&license_text) {
80− Ok(None)
81− } else {
82− Err(format!("ERROR: License is of unknown type: {:?}", path).into())
83− }
84−}
85−
86−fn include_license_in_acknowledgments(license_text: &str) -> bool {
87− let markers = vec![
88− // MIT
89− "The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.",
90−
91− // BSD
92− "Redistributions in binary form must reproduce the above copyright notice,",
93−
94− // Apache 2.0
95− "Apache License Version 2.0, January 2004 http://www.apache.org/licenses/",
96− "Licensed under the Apache License, Version 2.0 (the \"License\");",
97− ];
98−
99− license_contains_marker(license_text, &markers)
100−}
101−
102−fn license_not_needed_in_acknowledgements(license_text: &str) -> bool {
103− let markers = vec![
104− // Public domain
105− "This is free and unencumbered software released into the public domain.",
106−
107− // Public domain with stronger wording than above
108− "DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE",
109−
110− // Special license of assets/syntaxes/01_Packages/LICENSE
111− "Permission to copy, use, modify, sell and distribute this software is granted. This software is provided \"as is\" without express or implied warranty, and with no claim as to its suitability for any purpose."
112− ];
113−
114− license_contains_marker(license_text, &markers)
115−}
116−
117−fn license_contains_marker(license_text: &str, markers: &[&str]) -> bool {
118− let normalized_license_text = normalize_license_text(license_text);
119− markers.iter().any(|m| normalized_license_text.contains(m))
120−}
121−
122−fn append_to_acknowledgements(
123− acknowledgements: &mut String,
124− relative_path: &str,
125− license_text: &str,
126−) {
127− acknowledgements.push_str(&format!("## {}\n\n{}", relative_path, license_text));
128−
129− // Make sure the last char is a newline to not mess up formatting later
130− if acknowledgements
131− .chars()
132− .last()
133− .expect("acknowledgements is not the empty string")
134− != '\n'
135− {
136− acknowledgements.push('\n');
137− }
138−
139− // Add two more newlines to make it easy to distinguish where this text ends
140− // and the next starts
141− acknowledgements.push_str("\n\n");
142−}
143−
144−/// Replaces newlines with a space character, and replaces multiple spaces with one space.
145−/// This makes the text easier to analyze.
146−fn normalize_license_text(license_text: &str) -> String {
147− use regex::Regex;
148−
149− let whitespace_and_newlines = Regex::new(r"\s").unwrap();
150− let as_single_line = whitespace_and_newlines.replace_all(license_text, " ");
151−
152− let many_spaces = Regex::new(" +").unwrap();
153− many_spaces.replace_all(&as_single_line, " ").to_string()
154−}
155−
156−#[cfg(test)]
157−mod tests {
158− #[cfg(test)]
159− use super::*;
160−
161− #[test]
162− fn test_normalize_license_text() {
163− let license_text = "This is a license text with these terms:
164− * Complicated multi-line
165− term with indentation";
166−
167− assert_eq!(
168− "This is a license text with these terms: * Complicated multi-line term with indentation".to_owned(),
169− normalize_license_text(license_text),
170− );
171− }
172−
173− #[test]
174− fn test_normalize_license_text_with_windows_line_endings() {
175− let license_text = "This license text includes windows line endings\r
176−and we need to handle that.";
177−
178− assert_eq!(
179− "This license text includes windows line endings and we need to handle that."
180− .to_owned(),
181− normalize_license_text(license_text),
182− );
183− }
184−
185− #[test]
186− fn test_append_to_acknowledgements_adds_newline_if_missing() {
187− let mut acknowledgements = "preamble\n\n\n".to_owned();
188−
189− append_to_acknowledgements(&mut acknowledgements, "some/path", "line without newline");
190− assert_eq!(
191− "preamble
192−
193−
194−## some/path
195−
196−line without newline
197−
198−
199−",
200− acknowledgements
201− );
202−
203− append_to_acknowledgements(&mut acknowledgements, "another/path", "line with newline\n");
204− assert_eq!(
205− "preamble
206−
207−
208−## some/path
209−
210−line without newline
211−
212−
213−## another/path
214−
215−line with newline
216−
217−
218−",
219− acknowledgements
220− );
221− }
222−}
src/assets/lazy_theme_set.rsdeleted−104
@@ -1,104 +0,0 @@
1−use super::*;
2−
3−use std::collections::BTreeMap;
4−use std::convert::TryFrom;
5−
6−use serde::Deserialize;
7−use serde::Serialize;
8−
9−use once_cell::unsync::OnceCell;
10−
11−use syntect::highlighting::{Theme, ThemeSet};
12−
13−/// Same structure as a [`syntect::highlighting::ThemeSet`] but with themes
14−/// stored in raw serialized form, and deserialized on demand.
15−#[derive(Debug, Default, Serialize, Deserialize)]
16−pub struct LazyThemeSet {
17− /// This is a [`BTreeMap`] because that's what [`syntect::highlighting::ThemeSet`] uses
18− themes: BTreeMap<String, LazyTheme>,
19−}
20−
21−/// Stores raw serialized data for a theme with methods to lazily deserialize
22−/// (load) the theme.
23−#[derive(Debug, Serialize, Deserialize)]
24−struct LazyTheme {
25− serialized: Vec<u8>,
26−
27− #[serde(skip, default = "OnceCell::new")]
28− deserialized: OnceCell<syntect::highlighting::Theme>,
29−}
30−
31−impl LazyThemeSet {
32− /// Lazily load the given theme
33− pub fn get(&self, name: &str) -> Option<&Theme> {
34− self.themes.get(name).and_then(|lazy_theme| {
35− lazy_theme
36− .deserialized
37− .get_or_try_init(|| lazy_theme.deserialize())
38− .ok()
39− })
40− }
41−
42− /// Returns the name of all themes.
43− pub fn themes(&self) -> impl Iterator<Item = &str> {
44− self.themes.keys().map(|name| name.as_ref())
45− }
46−}
47−
48−impl LazyTheme {
49− fn deserialize(&self) -> Result<Theme> {
50− asset_from_contents(
51− &self.serialized[..],
52− "lazy-loaded theme",
53− COMPRESS_LAZY_THEMES,
54− )
55− }
56−}
57−
58−impl TryFrom<LazyThemeSet> for ThemeSet {
59− type Error = Error;
60−
61− /// Since the user might want to add custom themes to bat, we need a way to
62− /// convert from a `LazyThemeSet` to a regular [`ThemeSet`] so that more
63− /// themes can be added. This function does that pretty straight-forward
64− /// conversion.
65− fn try_from(lazy_theme_set: LazyThemeSet) -> Result<Self> {
66− let mut theme_set = ThemeSet::default();
67−
68− for (name, lazy_theme) in lazy_theme_set.themes {
69− theme_set.themes.insert(name, lazy_theme.deserialize()?);
70− }
71−
72− Ok(theme_set)
73− }
74−}
75−
76−#[cfg(feature = "build-assets")]
77−impl TryFrom<ThemeSet> for LazyThemeSet {
78− type Error = Error;
79−
80− /// To collect themes, a [`ThemeSet`] is needed. Once all desired themes
81− /// have been added, we need a way to convert that into [`LazyThemeSet`] so
82− /// that themes can be lazy-loaded later. This function does that
83− /// conversion.
84− fn try_from(theme_set: ThemeSet) -> Result<Self> {
85− let mut lazy_theme_set = LazyThemeSet::default();
86−
87− for (name, theme) in theme_set.themes {
88− // All we have to do is to serialize the theme
89− let lazy_theme = LazyTheme {
90− serialized: crate::assets::build_assets::asset_to_contents(
91− &theme,
92− &format!("theme {}", name),
93− COMPRESS_LAZY_THEMES,
94− )?,
95− deserialized: OnceCell::new(),
96− };
97−
98− // Ok done, now we can add it
99− lazy_theme_set.themes.insert(name, lazy_theme);
100− }
101−
102− Ok(lazy_theme_set)
103− }
104−}
src/assets/serialized_syntax_set.rsdeleted−27
@@ -1,27 +0,0 @@
1−use std::path::PathBuf;
2−
3−use syntect::parsing::SyntaxSet;
4−
5−use super::*;
6−
7−/// A SyntaxSet in serialized form, i.e. bincoded and flate2 compressed.
8−/// We keep it in this format since we want to load it lazily.
9−#[derive(Debug)]
10−pub enum SerializedSyntaxSet {
11− /// The data comes from a user-generated cache file.
12− FromFile(PathBuf),
13−
14− /// The data to use is embedded into the bat binary.
15− FromBinary(&'static [u8]),
16−}
17−
18−impl SerializedSyntaxSet {
19− pub fn deserialize(&self) -> Result<SyntaxSet> {
20− match self {
21− SerializedSyntaxSet::FromBinary(data) => Ok(from_binary(data, COMPRESS_SYNTAXES)),
22− SerializedSyntaxSet::FromFile(ref path) => {
23− asset_from_cache(path, "syntax set", COMPRESS_SYNTAXES)
24− }
25− }
26− }
27−}
src/assets/assets_metadata.rs → src/assets_metadata.rsrenamed+9−10
@@ -16,7 +16,6 @@ pub struct AssetsMetadata {
16const FILENAME: &str = "metadata.yaml";
16const FILENAME: &str = "metadata.yaml";
17
17
18impl AssetsMetadata {
18impl AssetsMetadata {
19− #[cfg(feature = "build-assets")]
20 pub(crate) fn new(current_version: &str) -> AssetsMetadata {
19 pub(crate) fn new(current_version: &str) -> AssetsMetadata {
21 AssetsMetadata {
20 AssetsMetadata {
22 bat_version: Some(current_version.to_owned()),
21 bat_version: Some(current_version.to_owned()),
@@ -24,7 +23,6 @@ impl AssetsMetadata {
24 }
23 }
25 }
24 }
26
25
27− #[cfg(feature = "build-assets")]
28 pub(crate) fn save_to_folder(&self, path: &Path) -> Result<()> {
26 pub(crate) fn save_to_folder(&self, path: &Path) -> Result<()> {
29 let file = File::create(path.join(FILENAME))?;
27 let file = File::create(path.join(FILENAME))?;
30 serde_yaml::to_writer(file, self)?;
28 serde_yaml::to_writer(file, self)?;
@@ -52,15 +50,16 @@ impl AssetsMetadata {
52 pub fn load_from_folder(path: &Path) -> Result<Option<Self>> {
50 pub fn load_from_folder(path: &Path) -> Result<Option<Self>> {
53 match Self::try_load_from_folder(path) {
51 match Self::try_load_from_folder(path) {
54 Ok(metadata) => Ok(Some(metadata)),
52 Ok(metadata) => Ok(Some(metadata)),
55− Err(e) => {
53+ Err(e) => match e.kind() {
56− if let Error::SerdeYamlError(_) = e {
54+ ErrorKind::SerdeYamlError(_) => Err(e),
57− Err(e)
55+ _ => {
58− } else if path.join("syntaxes.bin").exists() || path.join("themes.bin").exists() {
56+ if path.join("syntaxes.bin").exists() || path.join("themes.bin").exists() {
59− Ok(Some(Self::default()))
57+ Ok(Some(Self::default()))
60− } else {
58+ } else {
61− Ok(None)
59+ Ok(None)
60+ }
62 }
61 }
63− }
62+ },
64 }
63 }
65 }
64 }
66
65
src/bin/bat/app.rs+30−42
@@ -1,6 +1,6 @@
1use std::collections::HashSet;
1use std::collections::HashSet;
2use std::env;
2use std::env;
3−use std::path::Path;
3+use std::ffi::OsStr;
4use std::str::FromStr;
4use std::str::FromStr;
5
5
6use atty::{self, Stream};
6use atty::{self, Stream};
@@ -16,7 +16,6 @@ use console::Term;
16use crate::input::{new_file_input, new_stdin_input};
16use crate::input::{new_file_input, new_stdin_input};
17use bat::{
17use bat::{
18 assets::HighlightingAssets,
18 assets::HighlightingAssets,
19− bat_warning,
20 config::{Config, VisibleLines},
19 config::{Config, VisibleLines},
21 error::*,
20 error::*,
22 input::Input,
21 input::Input,
@@ -62,7 +61,7 @@ impl App {
62 // Read arguments from bats config file
61 // Read arguments from bats config file
63 let mut args = get_args_from_env_var()
62 let mut args = get_args_from_env_var()
64 .unwrap_or_else(get_args_from_config_file)
63 .unwrap_or_else(get_args_from_config_file)
65− .map_err(|_| "Could not parse configuration file")?;
64+ .chain_err(|| "Could not parse configuration file")?;
66
65
67 // Put the zero-th CLI argument (program name) first
66 // Put the zero-th CLI argument (program name) first
68 args.insert(0, cli_args.next().unwrap());
67 args.insert(0, cli_args.next().unwrap());
@@ -83,9 +82,10 @@ impl App {
83 Some("always") => PagingMode::Always,
82 Some("always") => PagingMode::Always,
84 Some("never") => PagingMode::Never,
83 Some("never") => PagingMode::Never,
85 Some("auto") | None => {
84 Some("auto") | None => {
86− // If we have -pp as an option when in auto mode, the pager should be disabled.
85+ if self.matches.occurrences_of("plain") > 1 {
87− let extra_plain = self.matches.occurrences_of("plain") > 1;
86+ // If we have -pp as an option when in auto mode, the pager should be disabled.
88− if extra_plain || self.matches.is_present("no-paging") {
87+ PagingMode::Never
88+ } else if self.matches.is_present("no-paging") {
89 PagingMode::Never
89 PagingMode::Never
90 } else if inputs.iter().any(Input::is_stdin) {
90 } else if inputs.iter().any(Input::is_stdin) {
91 // If we are reading from stdin, only enable paging if we write to an
91 // If we are reading from stdin, only enable paging if we write to an
@@ -107,12 +107,6 @@ impl App {
107
107
108 let mut syntax_mapping = SyntaxMapping::builtin();
108 let mut syntax_mapping = SyntaxMapping::builtin();
109
109
110− if let Some(values) = self.matches.values_of("ignored-suffix") {
111− for suffix in values {
112− syntax_mapping.insert_ignored_suffix(suffix);
113− }
114− }
115−
116 if let Some(values) = self.matches.values_of("map-syntax") {
110 if let Some(values) = self.matches.values_of("map-syntax") {
117 for from_to in values {
111 for from_to in values {
118 let parts: Vec<_> = from_to.split(':').collect();
112 let parts: Vec<_> = from_to.split(':').collect();
@@ -156,27 +150,28 @@ impl App {
156 wrapping_mode: if self.interactive_output || maybe_term_width.is_some() {
150 wrapping_mode: if self.interactive_output || maybe_term_width.is_some() {
157 match self.matches.value_of("wrap") {
151 match self.matches.value_of("wrap") {
158 Some("character") => WrappingMode::Character,
152 Some("character") => WrappingMode::Character,
159− Some("never") => WrappingMode::NoWrapping(true),
153+ Some("never") => WrappingMode::NoWrapping,
160 Some("auto") | None => {
154 Some("auto") | None => {
161 if style_components.plain() {
155 if style_components.plain() {
162− WrappingMode::NoWrapping(false)
156+ WrappingMode::NoWrapping
163 } else {
157 } else {
164 WrappingMode::Character
158 WrappingMode::Character
165 }
159 }
166 }
160 }
167− _ => unreachable!("other values for --wrap are not allowed"),
161+ _ => unreachable!("other values for --paging are not allowed"),
168 }
162 }
169 } else {
163 } else {
170 // We don't have the tty width when piping to another program.
164 // We don't have the tty width when piping to another program.
171 // There's no point in wrapping when this is the case.
165 // There's no point in wrapping when this is the case.
172− WrappingMode::NoWrapping(false)
166+ WrappingMode::NoWrapping
173 },
167 },
174 colored_output: self.matches.is_present("force-colorization")
168 colored_output: self.matches.is_present("force-colorization")
175 || match self.matches.value_of("color") {
169 || match self.matches.value_of("color") {
176 Some("always") => true,
170 Some("always") => true,
177 Some("never") => false,
171 Some("never") => false,
178− Some("auto") => env::var_os("NO_COLOR").is_none() && self.interactive_output,
172+ Some("auto") | _ => {
179− _ => unreachable!("other values for --color are not allowed"),
173+ env::var_os("NO_COLOR").is_none() && self.interactive_output
174+ }
180 },
175 },
181 paging_mode,
176 paging_mode,
182 term_width: maybe_term_width.unwrap_or(Term::stdout().size().1 as usize),
177 term_width: maybe_term_width.unwrap_or(Term::stdout().size().1 as usize),
@@ -231,16 +226,18 @@ impl App {
231 style_components,
226 style_components,
232 syntax_mapping,
227 syntax_mapping,
233 pager: self.matches.value_of("pager"),
228 pager: self.matches.value_of("pager"),
234− use_italic_text: self.matches.value_of("italic-text") == Some("always"),
229+ use_italic_text: match self.matches.value_of("italic-text") {
230+ Some("always") => true,
231+ _ => false,
232+ },
235 highlighted_lines: self
233 highlighted_lines: self
236 .matches
234 .matches
237 .values_of("highlight-line")
235 .values_of("highlight-line")
238 .map(|ws| ws.map(LineRange::from).collect())
236 .map(|ws| ws.map(LineRange::from).collect())
239 .transpose()?
237 .transpose()?
240 .map(LineRanges::from)
238 .map(LineRanges::from)
241− .map(HighlightedLineRanges)
239+ .map(|lr| HighlightedLineRanges(lr))
242 .unwrap_or_default(),
240 .unwrap_or_default(),
243− use_custom_assets: !self.matches.is_present("no-custom-assets"),
244 })
241 })
245 }
242 }
246
243
@@ -255,19 +252,16 @@ impl App {
255 }
252 }
256 _ => {}
253 _ => {}
257 }
254 }
258− let filenames: Option<Vec<&Path>> = self
255+ let filenames: Option<Vec<&str>> = self
259 .matches
256 .matches
260− .values_of_os("file-name")
257+ .values_of("file-name")
261− .map(|values| values.map(Path::new).collect());
258+ .map(|values| values.collect());
262
259
263− let mut filenames_or_none: Box<dyn Iterator<Item = Option<&Path>>> = match filenames {
260+ let mut filenames_or_none: Box<dyn Iterator<Item = _>> = match filenames {
264− Some(filenames) => Box::new(filenames.into_iter().map(Some)),
261+ Some(ref filenames) => Box::new(filenames.iter().map(|name| Some(OsStr::new(*name)))),
265 None => Box::new(std::iter::repeat(None)),
262 None => Box::new(std::iter::repeat(None)),
266 };
263 };
267− let files: Option<Vec<&Path>> = self
264+ let files: Option<Vec<&OsStr>> = self.matches.values_of_os("FILE").map(|vs| vs.collect());
268− .matches
269− .values_of_os("FILE")
270− .map(|vs| vs.map(Path::new).collect());
271
265
272 if files.is_none() {
266 if files.is_none() {
273 return Ok(vec![new_stdin_input(
267 return Ok(vec![new_stdin_input(
@@ -294,8 +288,8 @@ impl App {
294
288
295 fn style_components(&self) -> Result<StyleComponents> {
289 fn style_components(&self) -> Result<StyleComponents> {
296 let matches = &self.matches;
290 let matches = &self.matches;
297− let mut styled_components =
291+ Ok(StyleComponents(
298− StyleComponents(if matches.value_of("decorations") == Some("never") {
292+ if matches.value_of("decorations") == Some("never") {
299 HashSet::new()
293 HashSet::new()
300 } else if matches.is_present("number") {
294 } else if matches.is_present("number") {
301 [StyleComponent::LineNumbers].iter().cloned().collect()
295 [StyleComponent::LineNumbers].iter().cloned().collect()
@@ -307,7 +301,7 @@ impl App {
307 .map(|style_str| {
301 .map(|style_str| {
308 style_str
302 style_str
309 .split(',')
303 .split(',')
310− .map(StyleComponent::from_str)
304+ .map(|x| StyleComponent::from_str(&x))
311 .collect::<Result<Vec<StyleComponent>>>()
305 .collect::<Result<Vec<StyleComponent>>>()
312 })
306 })
313 .transpose()?;
307 .transpose()?;
@@ -322,20 +316,14 @@ impl App {
322 .collect::<Vec<_>>()
316 .collect::<Vec<_>>()
323 })
317 })
324 .or(env_style_components)
318 .or(env_style_components)
325− .unwrap_or_else(|| vec![StyleComponent::Default])
319+ .unwrap_or_else(|| vec![StyleComponent::Full])
326 .into_iter()
320 .into_iter()
327 .map(|style| style.components(self.interactive_output))
321 .map(|style| style.components(self.interactive_output))
328 .fold(HashSet::new(), |mut acc, components| {
322 .fold(HashSet::new(), |mut acc, components| {
329 acc.extend(components.iter().cloned());
323 acc.extend(components.iter().cloned());
330 acc
324 acc
331 })
325 })
332− });
326+ },
333−
327+ ))
334− // If `grid` is set, remove `rule` as it is a subset of `grid`, and print a warning.
335− if styled_components.grid() && styled_components.0.remove(&StyleComponent::Rule) {
336− bat_warning!("Style 'rule' is a subset of style 'grid', 'rule' will not be visible.");
337− }
338−
339− Ok(styled_components)
340 }
328 }
341}
329}
src/bin/bat/assets.rs+19−26
@@ -1,6 +1,5 @@
1use std::borrow::Cow;
1use std::borrow::Cow;
2use std::fs;
2use std::fs;
3−use std::io;
4
3
5use clap::crate_version;
4use clap::crate_version;
6
5
@@ -19,14 +18,26 @@ pub fn cache_dir() -> Cow<'static, str> {
19}
18}
20
19
21pub fn clear_assets() {
20pub fn clear_assets() {
22− clear_asset("themes.bin", "theme set cache");
21+ let theme_set_path = PROJECT_DIRS.cache_dir().join("themes.bin");
23− clear_asset("syntaxes.bin", "syntax set cache");
22+ let syntax_set_path = PROJECT_DIRS.cache_dir().join("syntaxes.bin");
24− clear_asset("metadata.yaml", "metadata file");
23+ let metadata_file = PROJECT_DIRS.cache_dir().join("metadata.yaml");
24+
25+ print!("Clearing theme set cache ... ");
26+ fs::remove_file(theme_set_path).ok();
27+ println!("okay");
28+
29+ print!("Clearing syntax set cache ... ");
30+ fs::remove_file(syntax_set_path).ok();
31+ println!("okay");
32+
33+ print!("Clearing metadata file ... ");
34+ fs::remove_file(metadata_file).ok();
35+ println!("okay");
25}
36}
26
37
27−pub fn assets_from_cache_or_binary(use_custom_assets: bool) -> Result<HighlightingAssets> {
38+pub fn assets_from_cache_or_binary() -> Result<HighlightingAssets> {
28 let cache_dir = PROJECT_DIRS.cache_dir();
39 let cache_dir = PROJECT_DIRS.cache_dir();
29− if let Some(metadata) = AssetsMetadata::load_from_folder(cache_dir)? {
40+ if let Some(metadata) = AssetsMetadata::load_from_folder(&cache_dir)? {
30 if !metadata.is_compatible_with(crate_version!()) {
41 if !metadata.is_compatible_with(crate_version!()) {
31 return Err(format!(
42 return Err(format!(
32 "The binary caches for the user-customized syntaxes and themes \
43 "The binary caches for the user-customized syntaxes and themes \
@@ -42,24 +53,6 @@ pub fn assets_from_cache_or_binary(use_custom_assets: bool) -> Result<Highlighti
42 }
53 }
43 }
54 }
44
55
45− let custom_assets = if use_custom_assets {
56+ Ok(HighlightingAssets::from_cache(&cache_dir)
46− HighlightingAssets::from_cache(cache_dir).ok()
57+ .unwrap_or_else(|_| HighlightingAssets::from_binary()))
47− } else {
48− None
49− };
50− Ok(custom_assets.unwrap_or_else(HighlightingAssets::from_binary))
51−}
52−
53−fn clear_asset(filename: &str, description: &str) {
54− print!("Clearing {} ... ", description);
55− let path = PROJECT_DIRS.cache_dir().join(filename);
56− match fs::remove_file(&path) {
57− Err(err) if err.kind() == io::ErrorKind::NotFound => {
58− println!("skipped (not present)");
59− }
60− Err(err) => {
61− println!("could not remove the cache file {:?}: {}", &path, err);
62− }
63− Ok(_) => println!("okay"),
64− }
65}
58}
src/bin/bat/clap_app.rs+11−79
@@ -1,21 +1,7 @@
1use clap::{crate_name, crate_version, App as ClapApp, AppSettings, Arg, ArgGroup, SubCommand};
1use clap::{crate_name, crate_version, App as ClapApp, AppSettings, Arg, ArgGroup, SubCommand};
2−use once_cell::sync::Lazy;
3use std::env;
2use std::env;
4use std::path::Path;
3use std::path::Path;
5
4
6−static VERSION: Lazy<String> = Lazy::new(|| {
7− #[cfg(feature = "bugreport")]
8− let git_version = bugreport::git_version!(fallback = "");
9− #[cfg(not(feature = "bugreport"))]
10− let git_version = "";
11−
12− if git_version.is_empty() {
13− crate_version!().to_string()
14− } else {
15− format!("{} ({})", crate_version!(), git_version)
16− }
17−});
18−
19pub fn build_app(interactive_output: bool) -> ClapApp<'static, 'static> {
5pub fn build_app(interactive_output: bool) -> ClapApp<'static, 'static> {
20 let clap_color_setting = if interactive_output && env::var_os("NO_COLOR").is_none() {
6 let clap_color_setting = if interactive_output && env::var_os("NO_COLOR").is_none() {
21 AppSettings::ColoredHelp
7 AppSettings::ColoredHelp
@@ -24,7 +10,7 @@ pub fn build_app(interactive_output: bool) -> ClapApp<'static, 'static> {
24 };
10 };
25
11
26 let mut app = ClapApp::new(crate_name!())
12 let mut app = ClapApp::new(crate_name!())
27− .version(VERSION.as_str())
13+ .version(crate_version!())
28 .global_setting(clap_color_setting)
14 .global_setting(clap_color_setting)
29 .global_setting(AppSettings::DeriveDisplayOrder)
15 .global_setting(AppSettings::DeriveDisplayOrder)
30 .global_setting(AppSettings::UnifiedHelpMessage)
16 .global_setting(AppSettings::UnifiedHelpMessage)
@@ -109,8 +95,7 @@ pub fn build_app(interactive_output: bool) -> ClapApp<'static, 'static> {
109 '--highlight-line 40' highlights line 40\n \
95 '--highlight-line 40' highlights line 40\n \
110 '--highlight-line 30:40' highlights lines 30 to 40\n \
96 '--highlight-line 30:40' highlights lines 30 to 40\n \
111 '--highlight-line :40' highlights lines 1 to 40\n \
97 '--highlight-line :40' highlights lines 1 to 40\n \
112− '--highlight-line 40:' highlights lines 40 to the end of the file\n \
98+ '--highlight-line 40:' highlights lines 40 to the end of the file",
113− '--highlight-line 30:+10' highlights lines 30 to 40",
114 ),
99 ),
115 )
100 )
116 .arg(
101 .arg(
@@ -309,7 +294,6 @@ pub fn build_app(interactive_output: bool) -> ClapApp<'static, 'static> {
309 .arg(
294 .arg(
310 Arg::with_name("no-paging")
295 Arg::with_name("no-paging")
311 .short("P")
296 .short("P")
312− .long("no-paging")
313 .alias("no-pager")
297 .alias("no-pager")
314 .overrides_with("no-paging")
298 .overrides_with("no-paging")
315 .hidden(true)
299 .hidden(true)
@@ -344,23 +328,10 @@ pub fn build_app(interactive_output: bool) -> ClapApp<'static, 'static> {
344 "Map a glob pattern to an existing syntax name. The glob pattern is matched \
328 "Map a glob pattern to an existing syntax name. The glob pattern is matched \
345 on the full path and the filename. For example, to highlight *.build files \
329 on the full path and the filename. For example, to highlight *.build files \
346 with the Python syntax, use -m '*.build:Python'. To highlight files named \
330 with the Python syntax, use -m '*.build:Python'. To highlight files named \
347− '.myignore' with the Git Ignore syntax, use -m '.myignore:Git Ignore'. Note \
331+ '.myignore' with the Git Ignore syntax, use -m '.myignore:Git Ignore'.",
348− that the right-hand side is the *name* of the syntax, not a file extension.",
349 )
332 )
350 .takes_value(true),
333 .takes_value(true),
351 )
334 )
352− .arg(
353− Arg::with_name("ignored-suffix")
354− .number_of_values(1)
355− .multiple(true)
356− .takes_value(true)
357− .long("ignored-suffix")
358− .hidden_short_help(true)
359− .help(
360− "Ignore extension. For example:\n \
361− 'bat --ignored-suffix \".dev\" my_file.json.dev' will use JSON syntax, and ignore '.dev'"
362− )
363− )
364 .arg(
335 .arg(
365 Arg::with_name("theme")
336 Arg::with_name("theme")
366 .long("theme")
337 .long("theme")
@@ -396,20 +367,11 @@ pub fn build_app(interactive_output: bool) -> ClapApp<'static, 'static> {
396 .validator(|val| {
367 .validator(|val| {
397 let mut invalid_vals = val.split(',').filter(|style| {
368 let mut invalid_vals = val.split(',').filter(|style| {
398 !&[
369 !&[
399− "auto",
370+ "auto", "full", "plain", "header", "grid", "numbers", "snip",
400− "full",
401− "default",
402− "plain",
403− "header",
404− "header-filename",
405− "header-filesize",
406− "grid",
407− "rule",
408− "numbers",
409− "snip",
410 #[cfg(feature = "git")]
371 #[cfg(feature = "git")]
411− "changes",
372+ "changes",
412− ].contains(style)
373+ ]
374+ .contains(style)
413 });
375 });
414
376
415 if let Some(invalid) = invalid_vals.next() {
377 if let Some(invalid) = invalid_vals.next() {
@@ -420,7 +382,7 @@ pub fn build_app(interactive_output: bool) -> ClapApp<'static, 'static> {
420 })
382 })
421 .help(
383 .help(
422 "Comma-separated list of style elements to display \
384 "Comma-separated list of style elements to display \
423− (*default*, auto, full, plain, changes, header, header-filename, header-filesize, grid, rule, numbers, snip).",
385+ (*auto*, full, plain, changes, header, grid, numbers, snip).",
424 )
386 )
425 .long_help(
387 .long_help(
426 "Configure which elements (line numbers, file headers, grid \
388 "Configure which elements (line numbers, file headers, grid \
@@ -431,17 +393,13 @@ pub fn build_app(interactive_output: bool) -> ClapApp<'static, 'static> {
431 '--style=\"..\"' option to the configuration file or export the \
393 '--style=\"..\"' option to the configuration file or export the \
432 BAT_STYLE environment variable (e.g.: export BAT_STYLE=\"..\").\n\n\
394 BAT_STYLE environment variable (e.g.: export BAT_STYLE=\"..\").\n\n\
433 Possible values:\n\n \
395 Possible values:\n\n \
434− * default: enables recommended style components (default).\n \
435 * full: enables all available components.\n \
396 * full: enables all available components.\n \
436− * auto: same as 'default', unless the output is piped.\n \
397+ * auto: same as 'full', unless the output is piped (default).\n \
437 * plain: disables all available components.\n \
398 * plain: disables all available components.\n \
438 * changes: show Git modification markers.\n \
399 * changes: show Git modification markers.\n \
439− * header: alias for 'header-filename'.\n \
400+ * header: show filenames before the content.\n \
440− * header-filename: show filenames before the content.\n \
441− * header-filesize: show file sizes before the content.\n \
442 * grid: vertical/horizontal lines to separate side bar\n \
401 * grid: vertical/horizontal lines to separate side bar\n \
443 and the header from the content.\n \
402 and the header from the content.\n \
444− * rule: horizontal lines to delimit files.\n \
445 * numbers: show line numbers in the side bar.\n \
403 * numbers: show line numbers in the side bar.\n \
446 * snip: draw separation lines between distinct line ranges.",
404 * snip: draw separation lines between distinct line ranges.",
447 ),
405 ),
@@ -462,8 +420,7 @@ pub fn build_app(interactive_output: bool) -> ClapApp<'static, 'static> {
462 '--line-range 30:40' prints lines 30 to 40\n \
420 '--line-range 30:40' prints lines 30 to 40\n \
463 '--line-range :40' prints lines 1 to 40\n \
421 '--line-range :40' prints lines 1 to 40\n \
464 '--line-range 40:' prints lines 40 to the end of the file\n \
422 '--line-range 40:' prints lines 40 to the end of the file\n \
465− '--line-range 40' only prints line 40\n \
423+ '--line-range 40' only prints line 40",
466− '--line-range 30:+10' prints lines 30 to 40",
467 ),
424 ),
468 )
425 )
469 .arg(
426 .arg(
@@ -491,12 +448,6 @@ pub fn build_app(interactive_output: bool) -> ClapApp<'static, 'static> {
491 .hidden(true)
448 .hidden(true)
492 .help("Do not use the configuration file"),
449 .help("Do not use the configuration file"),
493 )
450 )
494− .arg(
495− Arg::with_name("no-custom-assets")
496− .long("no-custom-assets")
497− .hidden(true)
498− .help("Do not load custom assets"),
499− )
500 .arg(
451 .arg(
501 Arg::with_name("config-file")
452 Arg::with_name("config-file")
502 .long("config-file")
453 .long("config-file")
@@ -525,19 +476,6 @@ pub fn build_app(interactive_output: bool) -> ClapApp<'static, 'static> {
525 .hidden(true)
476 .hidden(true)
526 .help("Show bat's cache directory."),
477 .help("Show bat's cache directory."),
527 )
478 )
528− .arg(
529− Arg::with_name("diagnostic")
530− .long("diagnostic")
531− .alias("diagnostics")
532− .hidden_short_help(true)
533− .help("Show diagnostic information for bug reports.")
534− )
535− .arg(
536− Arg::with_name("acknowledgements")
537− .long("acknowledgements")
538− .hidden_short_help(true)
539− .help("Show acknowledgements."),
540− )
541 .help_message("Print this help message.")
479 .help_message("Print this help message.")
542 .version_message("Show version information.");
480 .version_message("Show version information.");
543
481
@@ -596,12 +534,6 @@ pub fn build_app(interactive_output: bool) -> ClapApp<'static, 'static> {
596 "Create completely new syntax and theme sets \
534 "Create completely new syntax and theme sets \
597 (instead of appending to the default sets).",
535 (instead of appending to the default sets).",
598 ),
536 ),
599− )
600− .arg(
601− Arg::with_name("acknowledgements")
602− .long("acknowledgements")
603− .requires("build")
604− .help("Build acknowledgements.bin."),
605 ),
537 ),
606 )
538 )
607 }
539 }
src/bin/bat/config.rs+6−12
@@ -10,12 +10,13 @@ pub fn config_file() -> PathBuf {
10 env::var("BAT_CONFIG_PATH")
10 env::var("BAT_CONFIG_PATH")
11 .ok()
11 .ok()
12 .map(PathBuf::from)
12 .map(PathBuf::from)
13+ .filter(|config_path| config_path.is_file())
13 .unwrap_or_else(|| PROJECT_DIRS.config_dir().join("config"))
14 .unwrap_or_else(|| PROJECT_DIRS.config_dir().join("config"))
14}
15}
15
16
16pub fn generate_config_file() -> bat::error::Result<()> {
17pub fn generate_config_file() -> bat::error::Result<()> {
17 let config_file = config_file();
18 let config_file = config_file();
18− if config_file.is_file() {
19+ if config_file.exists() {
19 println!(
20 println!(
20 "A config file already exists at: {}",
21 "A config file already exists at: {}",
21 config_file.to_string_lossy()
22 config_file.to_string_lossy()
@@ -64,20 +65,13 @@ pub fn generate_config_file() -> bat::error::Result<()> {
64#--pager="less --RAW-CONTROL-CHARS --quit-if-one-screen --mouse"
65#--pager="less --RAW-CONTROL-CHARS --quit-if-one-screen --mouse"
65
66
66# Syntax mappings: map a certain filename pattern to a language.
67# Syntax mappings: map a certain filename pattern to a language.
67−# Example 1: use the C++ syntax for Arduino .ino files
68+# Example 1: use the C++ syntax for .ino files
68# Example 2: Use ".gitignore"-style highlighting for ".ignore" files
69# Example 2: Use ".gitignore"-style highlighting for ".ignore" files
69#--map-syntax "*.ino:C++"
70#--map-syntax "*.ino:C++"
70#--map-syntax ".ignore:Git Ignore"
71#--map-syntax ".ignore:Git Ignore"
71"#;
72"#;
72
73
73− fs::write(&config_file, default_config).map_err(|e| {
74+ fs::write(&config_file, default_config)?;
74− format!(
75− "Failed to create config file at '{}': {}",
76− config_file.to_string_lossy(),
77− e
78− )
79− })?;
80−
81 println!(
75 println!(
82 "Success! Config file written to {}",
76 "Success! Config file written to {}",
83 config_file.to_string_lossy()
77 config_file.to_string_lossy()
@@ -91,7 +85,7 @@ pub fn get_args_from_config_file() -> Result<Vec<OsString>, shell_words::ParseEr
91 .ok()
85 .ok()
92 .map(|content| get_args_from_str(&content))
86 .map(|content| get_args_from_str(&content))
93 .transpose()?
87 .transpose()?
94− .unwrap_or_default())
88+ .unwrap_or_else(|| vec![]))
95}
89}
96
90
97pub fn get_args_from_env_var() -> Option<Result<Vec<OsString>, shell_words::ParseError>> {
91pub fn get_args_from_env_var() -> Option<Result<Vec<OsString>, shell_words::ParseError>> {
@@ -104,7 +98,7 @@ fn get_args_from_str(content: &str) -> Result<Vec<OsString>, shell_words::ParseE
104 .map(|line| line.trim())
98 .map(|line| line.trim())
105 .filter(|line| !line.is_empty())
99 .filter(|line| !line.is_empty())
106 .filter(|line| !line.starts_with('#'))
100 .filter(|line| !line.starts_with('#'))
107− .map(shell_words::split)
101+ .map(|line| shell_words::split(line))
108 .collect::<Result<Vec<_>, _>>()?;
102 .collect::<Result<Vec<_>, _>>()?;
109
103
110 Ok(args_per_line
104 Ok(args_per_line
src/bin/bat/directories.rs+17−23
@@ -1,12 +1,11 @@
1use std::env;
1use std::env;
2use std::path::{Path, PathBuf};
2use std::path::{Path, PathBuf};
3
3
4−use once_cell::sync::Lazy;
4+use lazy_static::lazy_static;
5
5
6/// Wrapper for 'dirs' that treats MacOS more like Linux, by following the XDG specification.
6/// Wrapper for 'dirs' that treats MacOS more like Linux, by following the XDG specification.
7−/// The `XDG_CACHE_HOME` environment variable is checked first. `BAT_CONFIG_DIR`
7+/// This means that the `XDG_CACHE_HOME` and `XDG_CONFIG_HOME` environment variables are
8−/// is then checked before the `XDG_CONFIG_HOME` environment variable.
8+/// checked first. The fallback directories are `~/.cache/bat` and `~/.config/bat`, respectively.
9−/// The fallback directories are `~/.cache/bat` and `~/.config/bat`, respectively.
10pub struct BatProjectDirs {
9pub struct BatProjectDirs {
11 cache_dir: PathBuf,
10 cache_dir: PathBuf,
12 config_dir: PathBuf,
11 config_dir: PathBuf,
@@ -16,23 +15,16 @@ impl BatProjectDirs {
16 fn new() -> Option<BatProjectDirs> {
15 fn new() -> Option<BatProjectDirs> {
17 let cache_dir = BatProjectDirs::get_cache_dir()?;
16 let cache_dir = BatProjectDirs::get_cache_dir()?;
18
17
19− // Checks whether or not $BAT_CONFIG_DIR exists. If it doesn't, set our config dir
18+ #[cfg(target_os = "macos")]
20− // to our system's default configuration home.
19+ let config_dir_op = env::var_os("XDG_CONFIG_HOME")
21− let config_dir =
20+ .map(PathBuf::from)
22− if let Some(config_dir_op) = env::var_os("BAT_CONFIG_DIR").map(PathBuf::from) {
21+ .filter(|p| p.is_absolute())
23− config_dir_op
22+ .or_else(|| dirs::home_dir().map(|d| d.join(".config")));
24− } else {
25− #[cfg(target_os = "macos")]
26− let config_dir_op = env::var_os("XDG_CONFIG_HOME")
27− .map(PathBuf::from)
28− .filter(|p| p.is_absolute())
29− .or_else(|| dirs_next::home_dir().map(|d| d.join(".config")));
30
23
31− #[cfg(not(target_os = "macos"))]
24+ #[cfg(not(target_os = "macos"))]
32− let config_dir_op = dirs_next::config_dir();
25+ let config_dir_op = dirs::config_dir();
33
26
34− config_dir_op.map(|d| d.join("bat"))?
27+ let config_dir = config_dir_op.map(|d| d.join("bat"))?;
35− };
36
28
37 Some(BatProjectDirs {
29 Some(BatProjectDirs {
38 cache_dir,
30 cache_dir,
@@ -51,10 +43,10 @@ impl BatProjectDirs {
51 let cache_dir_op = env::var_os("XDG_CACHE_HOME")
43 let cache_dir_op = env::var_os("XDG_CACHE_HOME")
52 .map(PathBuf::from)
44 .map(PathBuf::from)
53 .filter(|p| p.is_absolute())
45 .filter(|p| p.is_absolute())
54− .or_else(|| dirs_next::home_dir().map(|d| d.join(".cache")));
46+ .or_else(|| dirs::home_dir().map(|d| d.join(".cache")));
55
47
56 #[cfg(not(target_os = "macos"))]
48 #[cfg(not(target_os = "macos"))]
57− let cache_dir_op = dirs_next::cache_dir();
49+ let cache_dir_op = dirs::cache_dir();
58
50
59 cache_dir_op.map(|d| d.join("bat"))
51 cache_dir_op.map(|d| d.join("bat"))
60 }
52 }
@@ -68,5 +60,7 @@ impl BatProjectDirs {
68 }
60 }
69}
61}
70
62
71−pub static PROJECT_DIRS: Lazy<BatProjectDirs> =
63+lazy_static! {
72− Lazy::new(|| BatProjectDirs::new().expect("Could not get home directory"));
64+ pub static ref PROJECT_DIRS: BatProjectDirs =
65+ BatProjectDirs::new().expect("Could not get home directory");
66+}
src/bin/bat/input.rs+5−5
@@ -1,15 +1,15 @@
1use bat::input::Input;
1use bat::input::Input;
2−use std::path::Path;
2+use std::ffi::OsStr;
3
3
4−pub fn new_file_input<'a>(file: &'a Path, name: Option<&'a Path>) -> Input<'a> {
4+pub fn new_file_input<'a>(file: &'a OsStr, name: Option<&'a OsStr>) -> Input<'a> {
5− named(Input::ordinary_file(file), name.or(Some(file)))
5+ named(Input::ordinary_file(file), name.or_else(|| Some(file)))
6}
6}
7
7
8−pub fn new_stdin_input(name: Option<&Path>) -> Input {
8+pub fn new_stdin_input(name: Option<&OsStr>) -> Input {
9 named(Input::stdin(), name)
9 named(Input::stdin(), name)
10}
10}
11
11
12−fn named<'a>(input: Input<'a>, name: Option<&Path>) -> Input<'a> {
12+fn named<'a>(input: Input<'a>, name: Option<&OsStr>) -> Input<'a> {
13 if let Some(provided_name) = name {
13 if let Some(provided_name) = name {
14 let mut input = input.with_name(Some(provided_name));
14 let mut input = input.with_name(Some(provided_name));
15 input.description_mut().set_kind(Some("File".to_owned()));
15 input.description_mut().set_kind(Some("File".to_owned()));
src/bin/bat/main.rs+53−134
@@ -1,4 +1,5 @@
1−#![deny(unsafe_code)]
1+// `error_chain!` can recurse deeply
2+#![recursion_limit = "1024"]
2
3
3mod app;
4mod app;
4mod assets;
5mod assets;
@@ -8,6 +9,7 @@ mod directories;
8mod input;
9mod input;
9
10
10use std::collections::{HashMap, HashSet};
11use std::collections::{HashMap, HashSet};
12+use std::ffi::OsStr;
11use std::io;
13use std::io;
12use std::io::{BufReader, Write};
14use std::io::{BufReader, Write};
13use std::path::Path;
15use std::path::Path;
@@ -22,46 +24,37 @@ use crate::{
22};
24};
23
25
24use assets::{assets_from_cache_or_binary, cache_dir, clear_assets, config_dir};
26use assets::{assets_from_cache_or_binary, cache_dir, clear_assets, config_dir};
27+use clap::crate_version;
25use directories::PROJECT_DIRS;
28use directories::PROJECT_DIRS;
26use globset::GlobMatcher;
29use globset::GlobMatcher;
27
30
28use bat::{
31use bat::{
32+ assets::HighlightingAssets,
29 config::Config,
33 config::Config,
30 controller::Controller,
34 controller::Controller,
31 error::*,
35 error::*,
32 input::Input,
36 input::Input,
33 style::{StyleComponent, StyleComponents},
37 style::{StyleComponent, StyleComponents},
34− MappingTarget, PagingMode,
38+ MappingTarget,
35};
39};
36
40
37const THEME_PREVIEW_DATA: &[u8] = include_bytes!("../../../assets/theme_preview.rs");
41const THEME_PREVIEW_DATA: &[u8] = include_bytes!("../../../assets/theme_preview.rs");
38
42
39−#[cfg(feature = "build-assets")]
40−fn build_assets(matches: &clap::ArgMatches) -> Result<()> {
41− let source_dir = matches
42− .value_of("source")
43− .map(Path::new)
44− .unwrap_or_else(|| PROJECT_DIRS.config_dir());
45− let target_dir = matches
46− .value_of("target")
47− .map(Path::new)
48− .unwrap_or_else(|| PROJECT_DIRS.cache_dir());
49−
50− bat::assets::build(
51− source_dir,
52− !matches.is_present("blank"),
53− matches.is_present("acknowledgements"),
54− target_dir,
55− clap::crate_version!(),
56− )
57−}
58−
59fn run_cache_subcommand(matches: &clap::ArgMatches) -> Result<()> {
43fn run_cache_subcommand(matches: &clap::ArgMatches) -> Result<()> {
60 if matches.is_present("build") {
44 if matches.is_present("build") {
61− #[cfg(feature = "build-assets")]
45+ let source_dir = matches
62− build_assets(matches)?;
46+ .value_of("source")
63− #[cfg(not(feature = "build-assets"))]
47+ .map(Path::new)
64− println!("bat has been built without the 'build-assets' feature. The 'cache --build' option is not available.");
48+ .unwrap_or_else(|| PROJECT_DIRS.config_dir());
49+ let target_dir = matches
50+ .value_of("target")
51+ .map(Path::new)
52+ .unwrap_or_else(|| PROJECT_DIRS.cache_dir());
53+
54+ let blank = matches.is_present("blank");
55+
56+ let assets = HighlightingAssets::from_files(source_dir, !blank)?;
57+ assets.save_to_cache(target_dir, crate_version!())?;
65 } else if matches.is_present("clear") {
58 } else if matches.is_present("clear") {
66 clear_assets();
59 clear_assets();
67 }
60 }
@@ -74,27 +67,28 @@ fn get_syntax_mapping_to_paths<'a>(
74) -> HashMap<&'a str, Vec<String>> {
67) -> HashMap<&'a str, Vec<String>> {
75 let mut map = HashMap::new();
68 let mut map = HashMap::new();
76 for mapping in mappings {
69 for mapping in mappings {
77− if let (matcher, MappingTarget::MapTo(s)) = mapping {
70+ match mapping {
78− let globs = map.entry(*s).or_insert_with(Vec::new);
71+ (_, MappingTarget::MapToUnknown) => {}
79− globs.push(matcher.glob().glob().into());
72+ (matcher, MappingTarget::MapTo(s)) => {
73+ let globs = map.entry(*s).or_insert_with(Vec::new);
74+ globs.push(matcher.glob().glob().into());
75+ }
80 }
76 }
81 }
77 }
82 map
78 map
83}
79}
84
80
85−pub fn get_languages(config: &Config) -> Result<String> {
81+pub fn list_languages(config: &Config) -> Result<()> {
86− let mut result: String = String::new();
82+ let assets = assets_from_cache_or_binary()?;
87−
88− let assets = assets_from_cache_or_binary(config.use_custom_assets)?;
89 let mut languages = assets
83 let mut languages = assets
90− .get_syntaxes()?
84+ .syntaxes()
91 .iter()
85 .iter()
92 .filter(|syntax| !syntax.hidden && !syntax.file_extensions.is_empty())
86 .filter(|syntax| !syntax.hidden && !syntax.file_extensions.is_empty())
93 .cloned()
87 .cloned()
94 .collect::<Vec<_>>();
88 .collect::<Vec<_>>();
95
89
96 // Handling of file-extension conflicts, see issue #1076
90 // Handling of file-extension conflicts, see issue #1076
97− for lang in &mut languages {
91+ for lang in languages.iter_mut() {
98 let lang_name = lang.name.clone();
92 let lang_name = lang.name.clone();
99 lang.file_extensions.retain(|extension| {
93 lang.file_extensions.retain(|extension| {
100 // The 'extension' variable is not certainly a real extension.
94 // The 'extension' variable is not certainly a real extension.
@@ -103,12 +97,14 @@ pub fn get_languages(config: &Config) -> Result<String> {
103 // Also skip if the 'extension' contains another real extension, likely
97 // Also skip if the 'extension' contains another real extension, likely
104 // that is a full match file name like 'CMakeLists.txt' and 'Cargo.lock'
98 // that is a full match file name like 'CMakeLists.txt' and 'Cargo.lock'
105 if extension.starts_with('.') || Path::new(extension).extension().is_some() {
99 if extension.starts_with('.') || Path::new(extension).extension().is_some() {
106− return true;
100+ true
101+ } else {
102+ let test_file = Path::new("test").with_extension(extension);
103+ match assets.syntax_for_file_name(test_file, &config.syntax_mapping) {
104+ Some(syntax) => syntax.name == lang_name,
105+ None => false,
106+ }
107 }
107 }
108−
109− let test_file = Path::new("test").with_extension(extension);
110− let syntax_in_set = assets.get_syntax_for_path(test_file, &config.syntax_mapping);
111− matches!(syntax_in_set, Ok(syntax_in_set) if syntax_in_set.syntax.name == lang_name)
112 });
108 });
113 }
109 }
114
110
@@ -116,16 +112,19 @@ pub fn get_languages(config: &Config) -> Result<String> {
116
112
117 let configured_languages = get_syntax_mapping_to_paths(config.syntax_mapping.mappings());
113 let configured_languages = get_syntax_mapping_to_paths(config.syntax_mapping.mappings());
118
114
119− for lang in &mut languages {
115+ for lang in languages.iter_mut() {
120 if let Some(additional_paths) = configured_languages.get(lang.name.as_str()) {
116 if let Some(additional_paths) = configured_languages.get(lang.name.as_str()) {
121 lang.file_extensions
117 lang.file_extensions
122 .extend(additional_paths.iter().cloned());
118 .extend(additional_paths.iter().cloned());
123 }
119 }
124 }
120 }
125
121
122+ let stdout = io::stdout();
123+ let mut stdout = stdout.lock();
124+
126 if config.loop_through {
125 if config.loop_through {
127 for lang in languages {
126 for lang in languages {
128− result += &format!("{}:{}\n", lang.name, lang.file_extensions.join(","));
127+ writeln!(stdout, "{}:{}", lang.name, lang.file_extensions.join(","))?;
129 }
128 }
130 } else {
129 } else {
131 let longest = languages
130 let longest = languages
@@ -146,7 +145,7 @@ pub fn get_languages(config: &Config) -> Result<String> {
146 };
145 };
147
146
148 for lang in languages {
147 for lang in languages {
149− result += &format!("{:width$}{}", lang.name, separator, width = longest);
148+ write!(stdout, "{:width$}{}", lang.name, separator, width = longest)?;
150
149
151 // Number of characters on this line so far, wrap before `desired_width`
150 // Number of characters on this line so far, wrap before `desired_width`
152 let mut num_chars = 0;
151 let mut num_chars = 0;
@@ -157,20 +156,20 @@ pub fn get_languages(config: &Config) -> Result<String> {
157 let new_chars = word.len() + comma_separator.len();
156 let new_chars = word.len() + comma_separator.len();
158 if num_chars + new_chars >= desired_width {
157 if num_chars + new_chars >= desired_width {
159 num_chars = 0;
158 num_chars = 0;
160− result += &format!("\n{:width$}{}", "", separator, width = longest);
159+ write!(stdout, "\n{:width$}{}", "", separator, width = longest)?;
161 }
160 }
162
161
163 num_chars += new_chars;
162 num_chars += new_chars;
164− result += &format!("{}", style.paint(&word[..]));
163+ write!(stdout, "{}", style.paint(&word[..]))?;
165 if extension.peek().is_some() {
164 if extension.peek().is_some() {
166− result += comma_separator;
165+ write!(stdout, "{}", comma_separator)?;
167 }
166 }
168 }
167 }
169− result += "\n";
168+ writeln!(stdout)?;
170 }
169 }
171 }
170 }
172
171
173− Ok(result)
172+ Ok(())
174}
173}
175
174
176fn theme_preview_file<'a>() -> Input<'a> {
175fn theme_preview_file<'a>() -> Input<'a> {
@@ -178,7 +177,7 @@ fn theme_preview_file<'a>() -> Input<'a> {
178}
177}
179
178
180pub fn list_themes(cfg: &Config) -> Result<()> {
179pub fn list_themes(cfg: &Config) -> Result<()> {
181− let assets = assets_from_cache_or_binary(cfg.use_custom_assets)?;
180+ let assets = assets_from_cache_or_binary()?;
182 let mut config = cfg.clone();
181 let mut config = cfg.clone();
183 let mut style = HashSet::new();
182 let mut style = HashSet::new();
184 style.insert(StyleComponent::Plain);
183 style.insert(StyleComponent::Plain);
@@ -201,14 +200,6 @@ pub fn list_themes(cfg: &Config) -> Result<()> {
201 .ok();
200 .ok();
202 writeln!(stdout)?;
201 writeln!(stdout)?;
203 }
202 }
204− writeln!(
205− stdout,
206− "Further themes can be installed to '{}', \
207− and are added to the cache with `bat cache --build`. \
208− For more information, see:\n\n \
209− https://github.com/sharkdp/bat#adding-new-themes",
210− PROJECT_DIRS.config_dir().join("themes").to_string_lossy()
211− )?;
212 } else {
203 } else {
213 for theme in assets.themes() {
204 for theme in assets.themes() {
214 writeln!(stdout, "{}", theme)?;
205 writeln!(stdout, "{}", theme)?;
@@ -219,79 +210,16 @@ pub fn list_themes(cfg: &Config) -> Result<()> {
219}
210}
220
211
221fn run_controller(inputs: Vec<Input>, config: &Config) -> Result<bool> {
212fn run_controller(inputs: Vec<Input>, config: &Config) -> Result<bool> {
222− let assets = assets_from_cache_or_binary(config.use_custom_assets)?;
213+ let assets = assets_from_cache_or_binary()?;
223− let controller = Controller::new(config, &assets);
214+ let controller = Controller::new(&config, &assets);
224 controller.run(inputs)
215 controller.run(inputs)
225}
216}
226
217
227−#[cfg(feature = "bugreport")]
228−fn invoke_bugreport(app: &App) {
229− use bugreport::{bugreport, collector::*, format::Markdown};
230− let pager = bat::config::get_pager_executable(app.matches.value_of("pager"))
231− .unwrap_or_else(|| "less".to_owned()); // FIXME: Avoid non-canonical path to "less".
232−
233− let mut custom_assets_metadata = PROJECT_DIRS.cache_dir().to_path_buf();
234− custom_assets_metadata.push("metadata.yaml");
235−
236− let mut report = bugreport!()
237− .info(SoftwareVersion::default())
238− .info(OperatingSystem::default())
239− .info(CommandLine::default())
240− .info(EnvironmentVariables::list(&[
241− "SHELL",
242− "PAGER",
243− "LESS",
244− "LANG",
245− "LC_ALL",
246− "BAT_PAGER",
247− "BAT_CACHE_PATH",
248− "BAT_CONFIG_PATH",
249− "BAT_OPTS",
250− "BAT_STYLE",
251− "BAT_TABS",
252− "BAT_THEME",
253− "XDG_CONFIG_HOME",
254− "XDG_CACHE_HOME",
255− "COLORTERM",
256− "NO_COLOR",
257− "MANPAGER",
258− ]))
259− .info(FileContent::new("Config file", config_file()))
260− .info(FileContent::new(
261− "Custom assets metadata",
262− custom_assets_metadata,
263− ))
264− .info(DirectoryEntries::new(
265− "Custom assets",
266− PROJECT_DIRS.cache_dir(),
267− ))
268− .info(CompileTimeInformation::default());
269−
270− #[cfg(feature = "paging")]
271− if let Ok(resolved_path) = grep_cli::resolve_binary(pager) {
272− report = report.info(CommandOutput::new(
273− "Less version",
274− resolved_path,
275− &["--version"],
276− ))
277− };
278−
279− report.print::<Markdown>();
280−}
281−
282/// Returns `Err(..)` upon fatal errors. Otherwise, returns `Ok(true)` on full success and
218/// Returns `Err(..)` upon fatal errors. Otherwise, returns `Ok(true)` on full success and
283/// `Ok(false)` if any intermediate errors occurred (were printed).
219/// `Ok(false)` if any intermediate errors occurred (were printed).
284fn run() -> Result<bool> {
220fn run() -> Result<bool> {
285 let app = App::new()?;
221 let app = App::new()?;
286
222
287− if app.matches.is_present("diagnostic") {
288− #[cfg(feature = "bugreport")]
289− invoke_bugreport(&app);
290− #[cfg(not(feature = "bugreport"))]
291− println!("bat has been built without the 'bugreport' feature. The '--diagnostic' option is not available.");
292− return Ok(true);
293− }
294−
295 match app.matches.subcommand() {
223 match app.matches.subcommand() {
296 ("cache", Some(cache_matches)) => {
224 ("cache", Some(cache_matches)) => {
297 // If there is a file named 'cache' in the current working directory,
225 // If there is a file named 'cache' in the current working directory,
@@ -301,7 +229,7 @@ fn run() -> Result<bool> {
301 run_cache_subcommand(cache_matches)?;
229 run_cache_subcommand(cache_matches)?;
302 Ok(true)
230 Ok(true)
303 } else {
231 } else {
304− let inputs = vec![Input::ordinary_file("cache")];
232+ let inputs = vec![Input::ordinary_file(OsStr::new("cache"))];
305 let config = app.config(&inputs)?;
233 let config = app.config(&inputs)?;
306
234
307 run_controller(inputs, &config)
235 run_controller(inputs, &config)
@@ -312,14 +240,8 @@ fn run() -> Result<bool> {
312 let config = app.config(&inputs)?;
240 let config = app.config(&inputs)?;
313
241
314 if app.matches.is_present("list-languages") {
242 if app.matches.is_present("list-languages") {
315− let languages: String = get_languages(&config)?;
243+ list_languages(&config)?;
316− let inputs: Vec<Input> = vec![Input::from_reader(Box::new(languages.as_bytes()))];
244+ Ok(true)
317− let plain_config = Config {
318− style_components: StyleComponents::new(StyleComponent::Plain.components(false)),
319− paging_mode: PagingMode::QuitIfOneScreen,
320− ..Default::default()
321− };
322− run_controller(inputs, &plain_config)
323 } else if app.matches.is_present("list-themes") {
245 } else if app.matches.is_present("list-themes") {
324 list_themes(&config)?;
246 list_themes(&config)?;
325 Ok(true)
247 Ok(true)
@@ -335,9 +257,6 @@ fn run() -> Result<bool> {
335 } else if app.matches.is_present("cache-dir") {
257 } else if app.matches.is_present("cache-dir") {
336 writeln!(io::stdout(), "{}", cache_dir())?;
258 writeln!(io::stdout(), "{}", cache_dir())?;
337 Ok(true)
259 Ok(true)
338− } else if app.matches.is_present("acknowledgements") {
339− writeln!(io::stdout(), "{}", bat::assets::get_acknowledgements())?;
340− Ok(true)
341 } else {
260 } else {
342 run_controller(inputs, &config)
261 run_controller(inputs, &config)
343 }
262 }
src/config.rs−12
@@ -82,18 +82,6 @@ pub struct Config<'a> {
82
82
83 /// Ranges of lines which should be highlighted with a special background color
83 /// Ranges of lines which should be highlighted with a special background color
84 pub highlighted_lines: HighlightedLineRanges,
84 pub highlighted_lines: HighlightedLineRanges,
85−
86− /// Whether or not to allow custom assets. If this is false or if custom assets (a.k.a.
87− /// cached assets) are not available, assets from the binary will be used instead.
88− pub use_custom_assets: bool,
89−}
90−
91−#[cfg(all(feature = "minimal-application", feature = "paging"))]
92−pub fn get_pager_executable(config_pager: Option<&str>) -> Option<String> {
93− crate::pager::get_pager(config_pager)
94− .ok()
95− .flatten()
96− .map(|pager| pager.bin)
97}
85}
98
86
99#[test]
87#[test]
src/controller.rs+75−92
@@ -1,4 +1,4 @@
1−use std::io::{self, BufRead, Write};
1+use std::io::{self, Write};
2
2
3use crate::assets::HighlightingAssets;
3use crate::assets::HighlightingAssets;
4use crate::config::{Config, VisibleLines};
4use crate::config::{Config, VisibleLines};
@@ -14,8 +14,6 @@ use crate::output::OutputType;
14use crate::paging::PagingMode;
14use crate::paging::PagingMode;
15use crate::printer::{InteractivePrinter, Printer, SimplePrinter};
15use crate::printer::{InteractivePrinter, Printer, SimplePrinter};
16
16
17−use clircle::{Clircle, Identifier};
18−
19pub struct Controller<'a> {
17pub struct Controller<'a> {
20 config: &'a Config<'a>,
18 config: &'a Config<'a>,
21 assets: &'a HighlightingAssets,
19 assets: &'a HighlightingAssets,
@@ -45,7 +43,7 @@ impl<'b> Controller<'b> {
45 // Do not launch the pager if NONE of the input files exist
43 // Do not launch the pager if NONE of the input files exist
46 let mut paging_mode = self.config.paging_mode;
44 let mut paging_mode = self.config.paging_mode;
47 if self.config.paging_mode != PagingMode::Never {
45 if self.config.paging_mode != PagingMode::Never {
48− let call_pager = inputs.iter().any(|input| {
46+ let call_pager = inputs.iter().any(|ref input| {
49 if let InputKind::OrdinaryFile(ref path) = input.kind {
47 if let InputKind::OrdinaryFile(ref path) = input.kind {
50 Path::new(path).exists()
48 Path::new(path).exists()
51 } else {
49 } else {
@@ -68,100 +66,88 @@ impl<'b> Controller<'b> {
68 }
66 }
69
67
70 let attached_to_pager = output_type.is_pager();
68 let attached_to_pager = output_type.is_pager();
71− let stdout_identifier = if cfg!(windows) || attached_to_pager {
72− None
73− } else {
74− clircle::Identifier::stdout()
75− };
76−
77 let writer = output_type.handle()?;
69 let writer = output_type.handle()?;
78 let mut no_errors: bool = true;
70 let mut no_errors: bool = true;
79− let stderr = io::stderr();
80
71
81− for (index, input) in inputs.into_iter().enumerate() {
72+ let stderr = io::stderr();
82− let identifier = stdout_identifier.as_ref();
73+ let print_error = |error: &Error, write: &mut dyn Write| {
83− let is_first = index == 0;
74+ if attached_to_pager {
84− let result = if input.is_stdin() {
75+ handle_error(error, write);
85− self.print_input(input, writer, io::stdin().lock(), identifier, is_first)
86 } else {
76 } else {
87− // Use dummy stdin since stdin is actually not used (#1902)
77+ handle_error(error, &mut stderr.lock());
88− self.print_input(input, writer, io::empty(), identifier, is_first)
89− };
90− if let Err(error) = result {
91− if attached_to_pager {
92− handle_error(&error, writer);
93− } else {
94− handle_error(&error, &mut stderr.lock());
95− }
96− no_errors = false;
97 }
78 }
98− }
79+ };
99−
100− Ok(no_errors)
101− }
102
80
103− fn print_input<R: BufRead>(
81+ for (index, input) in inputs.into_iter().enumerate() {
104− &self,
82+ match input.open(io::stdin().lock()) {
105− input: Input,
83+ Err(error) => {
106− writer: &mut dyn Write,
84+ print_error(&error, writer);
107− stdin: R,
85+ no_errors = false;
108− stdout_identifier: Option<&Identifier>,
86+ }
109− is_first: bool,
87+ Ok(mut opened_input) => {
110− ) -> Result<()> {
88+ #[cfg(feature = "git")]
111− let mut opened_input = input.open(stdin, stdout_identifier)?;
89+ let line_changes = if self.config.visible_lines.diff_mode()
112− #[cfg(feature = "git")]
90+ || (!self.config.loop_through && self.config.style_components.changes())
113− let line_changes = if self.config.visible_lines.diff_mode()
114− || (!self.config.loop_through && self.config.style_components.changes())
115− {
116− match opened_input.kind {
117− crate::input::OpenedInputKind::OrdinaryFile(ref path) => {
118− let diff = get_git_diff(path);
119−
120− // Skip files without Git modifications
121− if self.config.visible_lines.diff_mode()
122− && diff
123− .as_ref()
124− .map(|changes| changes.is_empty())
125− .unwrap_or(false)
126 {
91 {
127− return Ok(());
92+ match opened_input.kind {
128− }
93+ crate::input::OpenedInputKind::OrdinaryFile(ref path) => {
94+ let diff = get_git_diff(path);
95+
96+ // Skip files without Git modifications
97+ if self.config.visible_lines.diff_mode()
98+ && diff
99+ .as_ref()
100+ .map(|changes| changes.is_empty())
101+ .unwrap_or(false)
102+ {
103+ continue;
104+ }
105+
106+ diff
107+ }
108+ _ if self.config.visible_lines.diff_mode() => {
109+ // Skip non-file inputs in diff mode
110+ continue;
111+ }
112+ _ => None,
113+ }
114+ } else {
115+ None
116+ };
129
117
130− diff
118+ let mut printer: Box<dyn Printer> = if self.config.loop_through {
131− }
119+ Box::new(SimplePrinter::new(&self.config))
132− _ if self.config.visible_lines.diff_mode() => {
120+ } else {
133− // Skip non-file inputs in diff mode
121+ Box::new(InteractivePrinter::new(
134− return Ok(());
122+ &self.config,
123+ &self.assets,
124+ &mut opened_input,
125+ #[cfg(feature = "git")]
126+ &line_changes,
127+ )?)
128+ };
129+
130+ let result = self.print_file(
131+ &mut *printer,
132+ writer,
133+ &mut opened_input,
134+ index != 0,
135+ #[cfg(feature = "git")]
136+ &line_changes,
137+ );
138+
139+ if let Err(error) = result {
140+ print_error(&error, writer);
141+ no_errors = false;
142+ }
135 }
143 }
136− _ => None,
137 }
144 }
138− } else {
145+ }
139− None
140− };
141−
142− let mut printer: Box<dyn Printer> = if self.config.loop_through {
143− Box::new(SimplePrinter::new(self.config))
144− } else {
145− Box::new(InteractivePrinter::new(
146− self.config,
147− self.assets,
148− &mut opened_input,
149− #[cfg(feature = "git")]
150− &line_changes,
151− )?)
152− };
153
146
154− self.print_file(
147+ Ok(no_errors)
155− &mut *printer,
156− writer,
157− &mut opened_input,
158− !is_first,
159− #[cfg(feature = "git")]
160− &line_changes,
161− )
162 }
148 }
163
149
164− fn print_file(
150+ fn print_file<'a>(
165 &self,
151 &self,
166 printer: &mut dyn Printer,
152 printer: &mut dyn Printer,
167 writer: &mut dyn Write,
153 writer: &mut dyn Write,
@@ -181,10 +167,9 @@ impl<'b> Controller<'b> {
181 let mut line_ranges: Vec<LineRange> = vec![];
167 let mut line_ranges: Vec<LineRange> = vec![];
182
168
183 if let Some(line_changes) = line_changes {
169 if let Some(line_changes) = line_changes {
184− for &line in line_changes.keys() {
170+ for line in line_changes.keys() {
185− let line = line as usize;
171+ let line = *line as usize;
186− line_ranges
172+ line_ranges.push(LineRange::new(line - context, line + context));
187− .push(LineRange::new(line.saturating_sub(context), line + context));
188 }
173 }
189 }
174 }
190
175
@@ -212,8 +197,6 @@ impl<'b> Controller<'b> {
212 let mut first_range: bool = true;
197 let mut first_range: bool = true;
213 let mut mid_range: bool = false;
198 let mut mid_range: bool = false;
214
199
215− let style_snip = self.config.style_components.snip();
216−
217 while reader.read_line(&mut line_buffer)? {
200 while reader.read_line(&mut line_buffer)? {
218 match line_ranges.check(line_number) {
201 match line_ranges.check(line_number) {
219 RangeCheckResult::BeforeOrBetweenRanges => {
202 RangeCheckResult::BeforeOrBetweenRanges => {
@@ -224,7 +207,7 @@ impl<'b> Controller<'b> {
224 }
207 }
225
208
226 RangeCheckResult::InRange => {
209 RangeCheckResult::InRange => {
227− if style_snip {
210+ if self.config.style_components.snip() {
228 if first_range {
211 if first_range {
229 first_range = false;
212 first_range = false;
230 mid_range = true;
213 mid_range = true;
src/diff.rs+2−1
@@ -1,6 +1,7 @@
1#![cfg(feature = "git")]
1#![cfg(feature = "git")]
2
2
3use std::collections::HashMap;
3use std::collections::HashMap;
4+use std::ffi::OsStr;
4use std::fs;
5use std::fs;
5use std::path::Path;
6use std::path::Path;
6
7
@@ -16,7 +17,7 @@ pub enum LineChange {
16
17
17pub type LineChanges = HashMap<u32, LineChange>;
18pub type LineChanges = HashMap<u32, LineChange>;
18
19
19−pub fn get_git_diff(filename: &Path) -> Option<LineChanges> {
20+pub fn get_git_diff(filename: &OsStr) -> Option<LineChanges> {
20 let repo = Repository::discover(&filename).ok()?;
21 let repo = Repository::discover(&filename).ok()?;
21
22
22 let repo_path_absolute = fs::canonicalize(repo.workdir()?).ok()?;
23 let repo_path_absolute = fs::canonicalize(repo.workdir()?).ok()?;
src/error.rs+22−39
@@ -1,55 +1,38 @@
1+use error_chain::error_chain;
1use std::io::Write;
2use std::io::Write;
2−use thiserror::Error;
3
3
4−#[derive(Error, Debug)]
4+error_chain! {
5−#[non_exhaustive]
5+ foreign_links {
6−pub enum Error {
6+ Clap(::clap::Error) #[cfg(feature = "application")];
7− #[error(transparent)]
7+ Io(::std::io::Error);
8− Io(#[from] ::std::io::Error),
8+ SyntectError(::syntect::LoadingError);
9− #[error(transparent)]
9+ ParseIntError(::std::num::ParseIntError);
10− SyntectError(#[from] ::syntect::Error),
10+ GlobParsingError(::globset::Error);
11− #[error(transparent)]
11+ SerdeYamlError(::serde_yaml::Error);
12− SyntectLoadingError(#[from] ::syntect::LoadingError),
13− #[error(transparent)]
14− ParseIntError(#[from] ::std::num::ParseIntError),
15− #[error(transparent)]
16− GlobParsingError(#[from] ::globset::Error),
17− #[error(transparent)]
18− SerdeYamlError(#[from] ::serde_yaml::Error),
19− #[error("unable to detect syntax for {0}")]
20− UndetectedSyntax(String),
21− #[error("unknown syntax: '{0}'")]
22− UnknownSyntax(String),
23− #[error("Unknown style '{0}'")]
24− UnknownStyle(String),
25− #[error("Use of bat as a pager is disallowed in order to avoid infinite recursion problems")]
26− InvalidPagerValueBat,
27− #[error("{0}")]
28− Msg(String),
29−}
30−
31−impl From<&'static str> for Error {
32− fn from(s: &'static str) -> Self {
33− Error::Msg(s.to_owned())
34 }
12 }
35−}
36
13
37−impl From<String> for Error {
14+ errors {
38− fn from(s: String) -> Self {
15+ UndetectedSyntax(input: String) {
39− Error::Msg(s)
16+ description("unable to detect syntax"),
17+ display("unable to detect syntax for {}", input)
18+ }
19+ UnknownSyntax(name: String) {
20+ description("unknown syntax"),
21+ display("unknown syntax: '{}'", name)
22+ }
40 }
23 }
41}
24}
42
25
43−pub type Result<T> = std::result::Result<T, Error>;
44−
45pub fn default_error_handler(error: &Error, output: &mut dyn Write) {
26pub fn default_error_handler(error: &Error, output: &mut dyn Write) {
46 use ansi_term::Colour::Red;
27 use ansi_term::Colour::Red;
47
28
48 match error {
29 match error {
49− Error::Io(ref io_error) if io_error.kind() == ::std::io::ErrorKind::BrokenPipe => {
30+ Error(ErrorKind::Io(ref io_error), _)
31+ if io_error.kind() == ::std::io::ErrorKind::BrokenPipe =>
32+ {
50 ::std::process::exit(0);
33 ::std::process::exit(0);
51 }
34 }
52− Error::SerdeYamlError(_) => {
35+ Error(ErrorKind::SerdeYamlError(_), _) => {
53 writeln!(
36 writeln!(
54 output,
37 output,
55 "{}: Error while parsing metadata.yaml file: {}",
38 "{}: Error while parsing metadata.yaml file: {}",
src/input.rs+41−98
@@ -1,10 +1,7 @@
1−use std::convert::TryFrom;
1+use std::ffi::{OsStr, OsString};
2−use std::fs;
3use std::fs::File;
2use std::fs::File;
4use std::io::{self, BufRead, BufReader, Read};
3use std::io::{self, BufRead, BufReader, Read};
5−use std::path::{Path, PathBuf};
6
4
7−use clircle::{Clircle, Identifier};
8use content_inspector::{self, ContentType};
5use content_inspector::{self, ContentType};
9
6
10use crate::error::*;
7use crate::error::*;
@@ -51,8 +48,8 @@ impl InputDescription {
51 }
48 }
52
49
53 pub fn title(&self) -> &String {
50 pub fn title(&self) -> &String {
54− match &self.title {
51+ match self.title.as_ref() {
55− Some(title) => title,
52+ Some(ref title) => title,
56 None => &self.name,
53 None => &self.name,
57 }
54 }
58 }
55 }
@@ -70,7 +67,7 @@ impl InputDescription {
70}
67}
71
68
72pub(crate) enum InputKind<'a> {
69pub(crate) enum InputKind<'a> {
73− OrdinaryFile(PathBuf),
70+ OrdinaryFile(OsString),
74 StdIn,
71 StdIn,
75 CustomReader(Box<dyn Read + 'a>),
72 CustomReader(Box<dyn Read + 'a>),
76}
73}
@@ -87,8 +84,7 @@ impl<'a> InputKind<'a> {
87
84
88#[derive(Clone, Default)]
85#[derive(Clone, Default)]
89pub(crate) struct InputMetadata {
86pub(crate) struct InputMetadata {
90− pub(crate) user_provided_name: Option<PathBuf>,
87+ pub(crate) user_provided_name: Option<OsString>,
91− pub(crate) size: Option<u64>,
92}
88}
93
89
94pub struct Input<'a> {
90pub struct Input<'a> {
@@ -98,7 +94,7 @@ pub struct Input<'a> {
98}
94}
99
95
100pub(crate) enum OpenedInputKind {
96pub(crate) enum OpenedInputKind {
101− OrdinaryFile(PathBuf),
97+ OrdinaryFile(OsString),
102 StdIn,
98 StdIn,
103 CustomReader,
99 CustomReader,
104}
100}
@@ -110,36 +106,12 @@ pub(crate) struct OpenedInput<'a> {
110 pub(crate) description: InputDescription,
106 pub(crate) description: InputDescription,
111}
107}
112
108
113−impl OpenedInput<'_> {
114− /// Get the path of the file:
115− /// If this was set by the metadata, that will take priority.
116− /// If it wasn't, it will use the real file path (if available).
117− pub(crate) fn path(&self) -> Option<&PathBuf> {
118− self.metadata
119− .user_provided_name
120− .as_ref()
121− .or(match self.kind {
122− OpenedInputKind::OrdinaryFile(ref path) => Some(path),
123− _ => None,
124− })
125− }
126−}
127−
128impl<'a> Input<'a> {
109impl<'a> Input<'a> {
129− pub fn ordinary_file(path: impl AsRef<Path>) -> Self {
110+ pub fn ordinary_file(path: &OsStr) -> Self {
130− Self::_ordinary_file(path.as_ref())
111+ let kind = InputKind::OrdinaryFile(path.to_os_string());
131− }
132−
133− fn _ordinary_file(path: &Path) -> Self {
134− let kind = InputKind::OrdinaryFile(path.to_path_buf());
135− let metadata = InputMetadata {
136− size: fs::metadata(path).map(|m| m.len()).ok(),
137− ..InputMetadata::default()
138− };
139−
140 Input {
112 Input {
141 description: kind.description(),
113 description: kind.description(),
142− metadata,
114+ metadata: InputMetadata::default(),
143 kind,
115 kind,
144 }
116 }
145 }
117 }
@@ -163,16 +135,17 @@ impl<'a> Input<'a> {
163 }
135 }
164
136
165 pub fn is_stdin(&self) -> bool {
137 pub fn is_stdin(&self) -> bool {
166− matches!(self.kind, InputKind::StdIn)
138+ if let InputKind::StdIn = self.kind {
167− }
139+ true
168−
140+ } else {
169− pub fn with_name(self, provided_name: Option<impl AsRef<Path>>) -> Self {
141+ false
170− self._with_name(provided_name.as_ref().map(|it| it.as_ref()))
142+ }
171 }
143 }
172
144
173− fn _with_name(mut self, provided_name: Option<&Path>) -> Self {
145+ pub fn with_name(mut self, provided_name: Option<&OsStr>) -> Self {
174− if let Some(name) = provided_name {
146+ match provided_name {
175− self.description.name = name.to_string_lossy().to_string()
147+ Some(name) => self.description.name = name.to_string_lossy().to_string(),
148+ None => {}
176 }
149 }
177
150
178 self.metadata.user_provided_name = provided_name.map(|n| n.to_owned());
151 self.metadata.user_provided_name = provided_name.map(|n| n.to_owned());
@@ -187,55 +160,25 @@ impl<'a> Input<'a> {
187 &mut self.description
160 &mut self.description
188 }
161 }
189
162
190− pub(crate) fn open<R: BufRead + 'a>(
163+ pub(crate) fn open<R: BufRead + 'a>(self, stdin: R) -> Result<OpenedInput<'a>> {
191− self,
192− stdin: R,
193− stdout_identifier: Option<&Identifier>,
194− ) -> Result<OpenedInput<'a>> {
195 let description = self.description().clone();
164 let description = self.description().clone();
196 match self.kind {
165 match self.kind {
197− InputKind::StdIn => {
166+ InputKind::StdIn => Ok(OpenedInput {
198− if let Some(stdout) = stdout_identifier {
167+ kind: OpenedInputKind::StdIn,
199− let input_identifier = Identifier::try_from(clircle::Stdio::Stdin)
168+ description,
200− .map_err(|e| format!("Stdin: Error identifying file: {}", e))?;
169+ metadata: self.metadata,
201− if stdout.surely_conflicts_with(&input_identifier) {
170+ reader: InputReader::new(stdin),
202− return Err("IO circle detected. The input from stdin is also an output. Aborting to avoid infinite loop.".into());
171+ }),
203− }
204− }
205−
206− Ok(OpenedInput {
207− kind: OpenedInputKind::StdIn,
208− description,
209− metadata: self.metadata,
210− reader: InputReader::new(stdin),
211− })
212− }
213−
214 InputKind::OrdinaryFile(path) => Ok(OpenedInput {
172 InputKind::OrdinaryFile(path) => Ok(OpenedInput {
215 kind: OpenedInputKind::OrdinaryFile(path.clone()),
173 kind: OpenedInputKind::OrdinaryFile(path.clone()),
216 description,
174 description,
217 metadata: self.metadata,
175 metadata: self.metadata,
218 reader: {
176 reader: {
219− let mut file = File::open(&path)
177+ let file = File::open(&path)
220 .map_err(|e| format!("'{}': {}", path.to_string_lossy(), e))?;
178 .map_err(|e| format!("'{}': {}", path.to_string_lossy(), e))?;
221 if file.metadata()?.is_dir() {
179 if file.metadata()?.is_dir() {
222 return Err(format!("'{}' is a directory.", path.to_string_lossy()).into());
180 return Err(format!("'{}' is a directory.", path.to_string_lossy()).into());
223 }
181 }
224−
225− if let Some(stdout) = stdout_identifier {
226− let input_identifier = Identifier::try_from(file).map_err(|e| {
227− format!("{}: Error identifying file: {}", path.to_string_lossy(), e)
228− })?;
229− if stdout.surely_conflicts_with(&input_identifier) {
230− return Err(format!(
231− "IO circle detected. The input from '{}' is also an output. Aborting to avoid infinite loop.",
232− path.to_string_lossy()
233− )
234− .into());
235− }
236− file = input_identifier.into_inner().expect("The file was lost in the clircle::Identifier, this should not have happened...");
237− }
238−
239 InputReader::new(BufReader::new(file))
182 InputReader::new(BufReader::new(file))
240 },
183 },
241 }),
184 }),
@@ -278,18 +221,18 @@ impl<'a> InputReader<'a> {
278 }
221 }
279
222
280 pub(crate) fn read_line(&mut self, buf: &mut Vec<u8>) -> io::Result<bool> {
223 pub(crate) fn read_line(&mut self, buf: &mut Vec<u8>) -> io::Result<bool> {
281− if !self.first_line.is_empty() {
224+ if self.first_line.is_empty() {
282− buf.append(&mut self.first_line);
225+ let res = self.inner.read_until(b'\n', buf).map(|size| size > 0)?;
283− return Ok(true);
284− }
285
226
286− let res = self.inner.read_until(b'\n', buf).map(|size| size > 0)?;
227+ if self.content_type == Some(ContentType::UTF_16LE) {
228+ self.inner.read_until(0x00, buf).ok();
229+ }
287
230
288− if self.content_type == Some(ContentType::UTF_16LE) {
231+ Ok(res)
289− let _ = self.inner.read_until(0x00, buf);
232+ } else {
233+ buf.append(&mut self.first_line);
234+ Ok(true)
290 }
235 }
291−
292− Ok(res)
293 }
236 }
294}
237}
295
238
@@ -304,21 +247,21 @@ fn basic() {
304
247
305 let res = reader.read_line(&mut buffer);
248 let res = reader.read_line(&mut buffer);
306 assert!(res.is_ok());
249 assert!(res.is_ok());
307− assert!(res.unwrap());
250+ assert_eq!(true, res.unwrap());
308 assert_eq!(b"#!/bin/bash\n", &buffer[..]);
251 assert_eq!(b"#!/bin/bash\n", &buffer[..]);
309
252
310 buffer.clear();
253 buffer.clear();
311
254
312 let res = reader.read_line(&mut buffer);
255 let res = reader.read_line(&mut buffer);
313 assert!(res.is_ok());
256 assert!(res.is_ok());
314− assert!(res.unwrap());
257+ assert_eq!(true, res.unwrap());
315 assert_eq!(b"echo hello", &buffer[..]);
258 assert_eq!(b"echo hello", &buffer[..]);
316
259
317 buffer.clear();
260 buffer.clear();
318
261
319 let res = reader.read_line(&mut buffer);
262 let res = reader.read_line(&mut buffer);
320 assert!(res.is_ok());
263 assert!(res.is_ok());
321− assert!(!res.unwrap());
264+ assert_eq!(false, res.unwrap());
322 assert!(buffer.is_empty());
265 assert!(buffer.is_empty());
323}
266}
324
267
@@ -333,20 +276,20 @@ fn utf16le() {
333
276
334 let res = reader.read_line(&mut buffer);
277 let res = reader.read_line(&mut buffer);
335 assert!(res.is_ok());
278 assert!(res.is_ok());
336− assert!(res.unwrap());
279+ assert_eq!(true, res.unwrap());
337 assert_eq!(b"\xFF\xFE\x73\x00\x0A\x00", &buffer[..]);
280 assert_eq!(b"\xFF\xFE\x73\x00\x0A\x00", &buffer[..]);
338
281
339 buffer.clear();
282 buffer.clear();
340
283
341 let res = reader.read_line(&mut buffer);
284 let res = reader.read_line(&mut buffer);
342 assert!(res.is_ok());
285 assert!(res.is_ok());
343− assert!(res.unwrap());
286+ assert_eq!(true, res.unwrap());
344 assert_eq!(b"\x64\x00", &buffer[..]);
287 assert_eq!(b"\x64\x00", &buffer[..]);
345
288
346 buffer.clear();
289 buffer.clear();
347
290
348 let res = reader.read_line(&mut buffer);
291 let res = reader.read_line(&mut buffer);
349 assert!(res.is_ok());
292 assert!(res.is_ok());
350− assert!(!res.unwrap());
293+ assert_eq!(false, res.unwrap());
351 assert!(buffer.is_empty());
294 assert!(buffer.is_empty());
352}
295}
src/less.rs+12−79
@@ -1,39 +1,19 @@
1#![cfg(feature = "paging")]
1#![cfg(feature = "paging")]
2
2
3−use std::ffi::OsStr;
4use std::process::Command;
3use std::process::Command;
5
4
6−#[derive(Debug, PartialEq)]
5+pub fn retrieve_less_version() -> Option<usize> {
7−pub enum LessVersion {
6+ let cmd = Command::new("less").arg("--version").output().ok()?;
8− Less(usize),
7+ parse_less_version(&cmd.stdout)
9− BusyBox,
10}
8}
11
9
12−pub fn retrieve_less_version(less_path: &dyn AsRef<OsStr>) -> Option<LessVersion> {
10+fn parse_less_version(output: &[u8]) -> Option<usize> {
13− let resolved_path = grep_cli::resolve_binary(less_path.as_ref()).ok()?;
11+ if output.starts_with(b"less ") {
14−
12+ let version = std::str::from_utf8(&output[5..]).ok()?;
15− let cmd = Command::new(resolved_path).arg("--version").output().ok()?;
13+ let end = version.find(' ')?;
16− if cmd.status.success() {
14+ version[..end].parse::<usize>().ok()
17− parse_less_version(&cmd.stdout)
18 } else {
15 } else {
19− parse_less_version_busybox(&cmd.stderr)
16+ None
20− }
21−}
22−
23−fn parse_less_version(output: &[u8]) -> Option<LessVersion> {
24− if !output.starts_with(b"less ") {
25− return None;
26− }
27−
28− let version = std::str::from_utf8(&output[5..]).ok()?;
29− let end = version.find(|c: char| !c.is_ascii_digit())?;
30− Some(LessVersion::Less(version[..end].parse::<usize>().ok()?))
31−}
32−
33−fn parse_less_version_busybox(output: &[u8]) -> Option<LessVersion> {
34− match std::str::from_utf8(output) {
35− Ok(version) if version.contains("BusyBox ") => Some(LessVersion::BusyBox),
36− _ => None,
37 }
17 }
38}
18}
39
19
@@ -47,7 +27,7 @@ For information about the terms of redistribution,
47see the file named README in the less distribution.
27see the file named README in the less distribution.
48Homepage: http://www.greenwoodsoftware.com/less";
28Homepage: http://www.greenwoodsoftware.com/less";
49
29
50− assert_eq!(Some(LessVersion::Less(487)), parse_less_version(output));
30+ assert_eq!(Some(487), parse_less_version(output));
51}
31}
52
32
53#[test]
33#[test]
@@ -60,7 +40,7 @@ For information about the terms of redistribution,
60see the file named README in the less distribution.
40see the file named README in the less distribution.
61Homepage: http://www.greenwoodsoftware.com/less";
41Homepage: http://www.greenwoodsoftware.com/less";
62
42
63− assert_eq!(Some(LessVersion::Less(529)), parse_less_version(output));
43+ assert_eq!(Some(529), parse_less_version(output));
64}
44}
65
45
66#[test]
46#[test]
@@ -73,20 +53,7 @@ For information about the terms of redistribution,
73see the file named README in the less distribution.
53see the file named README in the less distribution.
74Home page: http://www.greenwoodsoftware.com/less";
54Home page: http://www.greenwoodsoftware.com/less";
75
55
76− assert_eq!(Some(LessVersion::Less(551)), parse_less_version(output));
56+ assert_eq!(Some(551), parse_less_version(output));
77−}
78−
79−#[test]
80−fn test_parse_less_version_581_2() {
81− let output = b"less 581.2 (PCRE2 regular expressions)
82−Copyright (C) 1984-2021 Mark Nudelman
83−
84−less comes with NO WARRANTY, to the extent permitted by law.
85−For information about the terms of redistribution,
86−see the file named README in the less distribution.
87−Home page: https://greenwoodsoftware.com/less";
88−
89− assert_eq!(Some(LessVersion::Less(581)), parse_less_version(output));
90}
57}
91
58
92#[test]
59#[test]
@@ -94,38 +61,4 @@ fn test_parse_less_version_wrong_program() {
94 let output = b"more from util-linux 2.34";
61 let output = b"more from util-linux 2.34";
95
62
96 assert_eq!(None, parse_less_version(output));
63 assert_eq!(None, parse_less_version(output));
97− assert_eq!(None, parse_less_version_busybox(output));
98−}
99−
100−#[test]
101−fn test_parse_less_version_busybox() {
102− let output = b"pkg/less: unrecognized option '--version'
103−BusyBox v1.35.0 (2022-04-21 10:38:11 EDT) multi-call binary.
104−
105−Usage: less [-EFIMmNSRh~] [FILE]...
106−
107−View FILE (or stdin) one screenful at a time
108−
109− -E Quit once the end of a file is reached
110− -F Quit if entire file fits on first screen
111− -I Ignore case in all searches
112− -M,-m Display status line with line numbers
113− and percentage through the file
114− -N Prefix line number to each line
115− -S Truncate long lines
116− -R Remove color escape codes in input
117− -~ Suppress ~s displayed past EOF";
118−
119− assert_eq!(
120− Some(LessVersion::BusyBox),
121− parse_less_version_busybox(output)
122− );
123−}
124−
125−#[test]
126−fn test_parse_less_version_invalid_utf_8() {
127− let output = b"\xff";
128−
129− assert_eq!(None, parse_less_version(output));
130− assert_eq!(None, parse_less_version_busybox(output));
131}
64}
src/lib.rs+1−10
@@ -19,14 +19,8 @@
19//! .unwrap();
19//! .unwrap();
20//! ```
20//! ```
21
21
22−#![deny(unsafe_code)]
23−
24−mod macros;
25−
26pub mod assets;
22pub mod assets;
27−pub mod assets_metadata {
23+pub mod assets_metadata;
28− pub use super::assets::assets_metadata::*;
29−}
30pub mod config;
24pub mod config;
31pub mod controller;
25pub mod controller;
32mod decorations;
26mod decorations;
@@ -37,8 +31,6 @@ mod less;
37pub mod line_range;
31pub mod line_range;
38mod output;
32mod output;
39#[cfg(feature = "paging")]
33#[cfg(feature = "paging")]
40−mod pager;
41−#[cfg(feature = "paging")]
42pub(crate) mod paging;
34pub(crate) mod paging;
43mod preprocessor;
35mod preprocessor;
44mod pretty_printer;
36mod pretty_printer;
@@ -46,7 +38,6 @@ pub(crate) mod printer;
46pub mod style;
38pub mod style;
47pub(crate) mod syntax_mapping;
39pub(crate) mod syntax_mapping;
48mod terminal;
40mod terminal;
49−mod vscreen;
50pub(crate) mod wrapping;
41pub(crate) mod wrapping;
51
42
52pub use pretty_printer::{Input, PrettyPrinter};
43pub use pretty_printer::{Input, PrettyPrinter};
src/line_range.rs+1−69
@@ -47,28 +47,7 @@ impl LineRange {
47 }
47 }
48 2 => {
48 2 => {
49 new_range.lower = line_numbers[0].parse()?;
49 new_range.lower = line_numbers[0].parse()?;
50− let first_byte = line_numbers[1].bytes().next();
50+ new_range.upper = line_numbers[1].parse()?;
51−
52− new_range.upper = if first_byte == Some(b'+') {
53− let more_lines = &line_numbers[1][1..]
54− .parse()
55− .map_err(|_| "Invalid character after +")?;
56− new_range.lower + more_lines
57− } else if first_byte == Some(b'-') {
58− // this will prevent values like "-+5" even though "+5" is valid integer
59− if line_numbers[1][1..].bytes().next() == Some(b'+') {
60− return Err("Invalid character after -".into());
61− }
62− let prior_lines = &line_numbers[1][1..]
63− .parse()
64− .map_err(|_| "Invalid character after -")?;
65− let prev_lower = new_range.lower;
66− new_range.lower = new_range.lower.saturating_sub(*prior_lines);
67− prev_lower
68− } else {
69− line_numbers[1].parse()?
70− };
71−
72 Ok(new_range)
51 Ok(new_range)
73 }
52 }
74 _ => Err(
53 _ => Err(
@@ -121,53 +100,6 @@ fn test_parse_fail() {
121 assert!(range.is_err());
100 assert!(range.is_err());
122}
101}
123
102
124−#[test]
125−fn test_parse_plus() {
126− let range = LineRange::from("40:+10").expect("Shouldn't fail on test!");
127− assert_eq!(40, range.lower);
128− assert_eq!(50, range.upper);
129−}
130−
131−#[test]
132−fn test_parse_plus_fail() {
133− let range = LineRange::from("40:+z");
134− assert!(range.is_err());
135− let range = LineRange::from("40:+-10");
136− assert!(range.is_err());
137− let range = LineRange::from("40:+");
138− assert!(range.is_err());
139−}
140−
141−#[test]
142−fn test_parse_minus_success() {
143− let range = LineRange::from("40:-10").expect("Shouldn't fail on test!");
144− assert_eq!(30, range.lower);
145− assert_eq!(40, range.upper);
146−}
147−
148−#[test]
149−fn test_parse_minus_edge_cases_success() {
150− let range = LineRange::from("5:-4").expect("Shouldn't fail on test!");
151− assert_eq!(1, range.lower);
152− assert_eq!(5, range.upper);
153− let range = LineRange::from("5:-5").expect("Shouldn't fail on test!");
154− assert_eq!(0, range.lower);
155− assert_eq!(5, range.upper);
156− let range = LineRange::from("5:-100").expect("Shouldn't fail on test!");
157− assert_eq!(0, range.lower);
158− assert_eq!(5, range.upper);
159−}
160−
161−#[test]
162−fn test_parse_minus_fail() {
163− let range = LineRange::from("40:-z");
164− assert!(range.is_err());
165− let range = LineRange::from("40:-+10");
166− assert!(range.is_err());
167− let range = LineRange::from("40:-");
168− assert!(range.is_err());
169−}
170−
171#[derive(Copy, Clone, Debug, PartialEq)]
103#[derive(Copy, Clone, Debug, PartialEq)]
172pub enum RangeCheckResult {
104pub enum RangeCheckResult {
173 // Within one of the given ranges
105 // Within one of the given ranges
src/macros.rsdeleted−7
@@ -1,7 +0,0 @@
1−#[macro_export]
2−macro_rules! bat_warning {
3− ($($arg:tt)*) => ({
4− use ansi_term::Colour::Yellow;
5− eprintln!("{}: {}", Yellow.paint("[bat warning]"), format!($($arg)*));
6− })
7−}
src/output.rs+88−64
@@ -4,7 +4,7 @@ use std::process::Child;
4
4
5use crate::error::*;
5use crate::error::*;
6#[cfg(feature = "paging")]
6#[cfg(feature = "paging")]
7−use crate::less::{retrieve_less_version, LessVersion};
7+use crate::less::retrieve_less_version;
8#[cfg(feature = "paging")]
8#[cfg(feature = "paging")]
9use crate::paging::PagingMode;
9use crate::paging::PagingMode;
10#[cfg(feature = "paging")]
10#[cfg(feature = "paging")]
@@ -48,80 +48,100 @@ impl OutputType {
48 wrapping_mode: WrappingMode,
48 wrapping_mode: WrappingMode,
49 pager_from_config: Option<&str>,
49 pager_from_config: Option<&str>,
50 ) -> Result<Self> {
50 ) -> Result<Self> {
51− use crate::pager::{self, PagerKind, PagerSource};
51+ use std::env;
52+ use std::ffi::OsString;
53+ use std::path::PathBuf;
52 use std::process::{Command, Stdio};
54 use std::process::{Command, Stdio};
53
55
54− let pager_opt =
56+ let mut replace_arguments_to_less = false;
55− pager::get_pager(pager_from_config).map_err(|_| "Could not parse pager command.")?;
56
57
57− let pager = match pager_opt {
58+ let pager_from_env = match (env::var("BAT_PAGER"), env::var("PAGER")) {
58− Some(pager) => pager,
59+ (Ok(bat_pager), _) => Some(bat_pager),
59− None => return Ok(OutputType::stdout()),
60+ (_, Ok(pager)) => {
61+ // less needs to be called with the '-R' option in order to properly interpret the
62+ // ANSI color sequences printed by bat. If someone has set PAGER="less -F", we
63+ // therefore need to overwrite the arguments and add '-R'.
64+ //
65+ // We only do this for PAGER (as it is not specific to 'bat'), not for BAT_PAGER
66+ // or bats '--pager' command line option.
67+ replace_arguments_to_less = true;
68+ Some(pager)
69+ }
70+ _ => None,
60 };
71 };
61
72
62− if pager.kind == PagerKind::Bat {
73+ let pager_from_config = pager_from_config.map(|p| p.to_string());
63− return Err(Error::InvalidPagerValueBat);
74+
75+ if pager_from_config.is_some() {
76+ replace_arguments_to_less = false;
64 }
77 }
65
78
66− let resolved_path = match grep_cli::resolve_binary(&pager.bin) {
79+ let pager = pager_from_config
67− Ok(path) => path,
80+ .or(pager_from_env)
68− Err(_) => {
81+ .unwrap_or_else(|| String::from("less"));
69− return Ok(OutputType::stdout());
70− }
71− };
72
82
73− let mut p = Command::new(resolved_path);
83+ let pagerflags =
74− let args = pager.args;
84+ shell_words::split(&pager).chain_err(|| "Could not parse pager command.")?;
75−
85+
76− if pager.kind == PagerKind::Less {
86+ match pagerflags.split_first() {
77− // less needs to be called with the '-R' option in order to properly interpret the
87+ Some((pager_name, args)) => {
78− // ANSI color sequences printed by bat. If someone has set PAGER="less -F", we
88+ let mut pager_path = PathBuf::from(pager_name);
79− // therefore need to overwrite the arguments and add '-R'.
80− //
81− // We only do this for PAGER (as it is not specific to 'bat'), not for BAT_PAGER
82− // or bats '--pager' command line option.
83− let replace_arguments_to_less = pager.source == PagerSource::EnvVarPager;
84−
85− if args.is_empty() || replace_arguments_to_less {
86− p.arg("-R"); // Short version of --RAW-CONTROL-CHARS for maximum compatibility
87− if single_screen_action == SingleScreenAction::Quit {
88− p.arg("-F"); // Short version of --quit-if-one-screen for compatibility
89− }
90
89
91− if wrapping_mode == WrappingMode::NoWrapping(true) {
90+ if pager_path.file_stem() == Some(&OsString::from("bat")) {
92− p.arg("-S"); // Short version of --chop-long-lines for compatibility
91+ pager_path = PathBuf::from("less");
93 }
92 }
94
93
95− // Passing '--no-init' fixes a bug with '--quit-if-one-screen' in older
94+ let is_less = pager_path.file_stem() == Some(&OsString::from("less"));
96− // versions of 'less'. Unfortunately, it also breaks mouse-wheel support.
95+
97− //
96+ let mut process = if is_less {
98− // See: http://www.greenwoodsoftware.com/less/news.530.html
97+ let mut p = Command::new(&pager_path);
99− //
98+ if args.is_empty() || replace_arguments_to_less {
100− // For newer versions (530 or 558 on Windows), we omit '--no-init' as it
99+ p.arg("--RAW-CONTROL-CHARS");
101− // is not needed anymore.
100+ if single_screen_action == SingleScreenAction::Quit {
102− match retrieve_less_version(&pager.bin) {
101+ p.arg("--quit-if-one-screen");
103− None => {
102+ }
104− p.arg("--no-init");
103+
104+ if wrapping_mode == WrappingMode::NoWrapping {
105+ p.arg("--chop-long-lines");
106+ }
107+
108+ // Passing '--no-init' fixes a bug with '--quit-if-one-screen' in older
109+ // versions of 'less'. Unfortunately, it also breaks mouse-wheel support.
110+ //
111+ // See: http://www.greenwoodsoftware.com/less/news.530.html
112+ //
113+ // For newer versions (530 or 558 on Windows), we omit '--no-init' as it
114+ // is not needed anymore.
115+ match retrieve_less_version() {
116+ None => {
117+ p.arg("--no-init");
118+ }
119+ Some(version)
120+ if (version < 530 || (cfg!(windows) && version < 558)) =>
121+ {
122+ p.arg("--no-init");
123+ }
124+ _ => {}
125+ }
126+ } else {
127+ p.args(args);
105 }
128 }
106− Some(LessVersion::Less(version))
129+ p.env("LESSCHARSET", "UTF-8");
107− if (version < 530 || (cfg!(windows) && version < 558)) =>
130+ p
108− {
131+ } else {
109− p.arg("--no-init");
132+ let mut p = Command::new(&pager_path);
110− }
133+ p.args(args);
111− _ => {}
134+ p
112− }
135+ };
113− } else {
136+
114− p.args(args);
137+ Ok(process
138+ .stdin(Stdio::piped())
139+ .spawn()
140+ .map(OutputType::Pager)
141+ .unwrap_or_else(|_| OutputType::stdout()))
115 }
142 }
116− p.env("LESSCHARSET", "UTF-8");
143+ None => Ok(OutputType::stdout()),
117− } else {
144+ }
118− p.args(args);
119− };
120−
121− Ok(p.stdin(Stdio::piped())
122− .spawn()
123− .map(OutputType::Pager)
124− .unwrap_or_else(|_| OutputType::stdout()))
125 }
145 }
126
146
127 pub(crate) fn stdout() -> Self {
147 pub(crate) fn stdout() -> Self {
@@ -130,7 +150,11 @@ impl OutputType {
130
150
131 #[cfg(feature = "paging")]
151 #[cfg(feature = "paging")]
132 pub(crate) fn is_pager(&self) -> bool {
152 pub(crate) fn is_pager(&self) -> bool {
133− matches!(self, OutputType::Pager(_))
153+ if let OutputType::Pager(_) = self {
154+ true
155+ } else {
156+ false
157+ }
134 }
158 }
135
159
136 #[cfg(not(feature = "paging"))]
160 #[cfg(not(feature = "paging"))]
@@ -144,7 +168,7 @@ impl OutputType {
144 OutputType::Pager(ref mut command) => command
168 OutputType::Pager(ref mut command) => command
145 .stdin
169 .stdin
146 .as_mut()
170 .as_mut()
147− .ok_or("Could not open stdin for pager")?,
171+ .chain_err(|| "Could not open stdin for pager")?,
148 OutputType::Stdout(ref mut handle) => handle,
172 OutputType::Stdout(ref mut handle) => handle,
149 })
173 })
150 }
174 }
src/pager.rsdeleted−123
@@ -1,123 +0,0 @@
1−use shell_words::ParseError;
2−use std::env;
3−
4−/// If we use a pager, this enum tells us from where we were told to use it.
5−#[derive(Debug, PartialEq)]
6−pub(crate) enum PagerSource {
7− /// From --config
8− Config,
9−
10− /// From the env var BAT_PAGER
11− EnvVarBatPager,
12−
13− /// From the env var PAGER
14− EnvVarPager,
15−
16− /// No pager was specified, default is used
17− Default,
18−}
19−
20−/// We know about some pagers, for example 'less'. This is a list of all pagers we know about
21−#[derive(Debug, PartialEq)]
22−pub(crate) enum PagerKind {
23− /// bat
24− Bat,
25−
26− /// less
27− Less,
28−
29− /// more
30− More,
31−
32− /// most
33− Most,
34−
35− /// A pager we don't know about
36− Unknown,
37−}
38−
39−impl PagerKind {
40− fn from_bin(bin: &str) -> PagerKind {
41− use std::path::Path;
42−
43− match Path::new(bin)
44− .file_stem()
45− .map(|s| s.to_string_lossy())
46− .as_deref()
47− {
48− Some("bat") => PagerKind::Bat,
49− Some("less") => PagerKind::Less,
50− Some("more") => PagerKind::More,
51− Some("most") => PagerKind::Most,
52− _ => PagerKind::Unknown,
53− }
54− }
55−}
56−
57−/// A pager such as 'less', and from where we got it.
58−#[derive(Debug)]
59−pub(crate) struct Pager {
60− /// The pager binary
61− pub bin: String,
62−
63− /// The pager binary arguments (that we might tweak)
64− pub args: Vec<String>,
65−
66− /// What pager this is
67− pub kind: PagerKind,
68−
69− /// From where this pager comes
70− pub source: PagerSource,
71−}
72−
73−impl Pager {
74− fn new(bin: &str, args: &[String], kind: PagerKind, source: PagerSource) -> Pager {
75− Pager {
76− bin: String::from(bin),
77− args: args.to_vec(),
78− kind,
79− source,
80− }
81− }
82−}
83−
84−/// Returns what pager to use, after looking at both config and environment variables.
85−pub(crate) fn get_pager(config_pager: Option<&str>) -> Result<Option<Pager>, ParseError> {
86− let bat_pager = env::var("BAT_PAGER");
87− let pager = env::var("PAGER");
88−
89− let (cmd, source) = match (config_pager, &bat_pager, &pager) {
90− (Some(config_pager), _, _) => (config_pager, PagerSource::Config),
91− (_, Ok(bat_pager), _) => (bat_pager.as_str(), PagerSource::EnvVarBatPager),
92− (_, _, Ok(pager)) => (pager.as_str(), PagerSource::EnvVarPager),
93− _ => ("less", PagerSource::Default),
94− };
95−
96− let parts = shell_words::split(cmd)?;
97− match parts.split_first() {
98− Some((bin, args)) => {
99− let kind = PagerKind::from_bin(bin);
100−
101− let use_less_instead = if source == PagerSource::EnvVarPager {
102− // 'more' and 'most' do not supports colors; automatically use
103− // 'less' instead if the problematic pager came from the
104− // generic PAGER env var.
105− // If PAGER=bat, silently use 'less' instead to prevent
106− // recursion.
107− // Never silently use 'less' if BAT_PAGER or --pager has been
108− // specified.
109− matches!(kind, PagerKind::More | PagerKind::Most | PagerKind::Bat)
110− } else {
111− false
112− };
113−
114− Ok(Some(if use_less_instead {
115− let no_args = vec![];
116− Pager::new("less", &no_args, PagerKind::Less, PagerSource::EnvVarPager)
117− } else {
118− Pager::new(bin, args, kind, source)
119− }))
120− }
121− None => Ok(None),
122− }
123−}
src/preprocessor.rs+3−10
@@ -53,33 +53,26 @@ pub fn replace_nonprintable(input: &[u8], tab_width: usize) -> String {
53 let tab_width = if tab_width == 0 { 4 } else { tab_width };
53 let tab_width = if tab_width == 0 { 4 } else { tab_width };
54
54
55 let mut idx = 0;
55 let mut idx = 0;
56− let mut line_idx = 0;
57 let len = input.len();
56 let len = input.len();
58 while idx < len {
57 while idx < len {
59 if let Some((chr, skip_ahead)) = try_parse_utf8_char(&input[idx..]) {
58 if let Some((chr, skip_ahead)) = try_parse_utf8_char(&input[idx..]) {
60 idx += skip_ahead;
59 idx += skip_ahead;
61− line_idx += 1;
62
60
63 match chr {
61 match chr {
64 // space
62 // space
65 ' ' => output.push('·'),
63 ' ' => output.push('·'),
66 // tab
64 // tab
67 '\t' => {
65 '\t' => {
68− let tab_stop = tab_width - ((line_idx - 1) % tab_width);
66+ if tab_width == 1 {
69− line_idx = 0;
70− if tab_stop == 1 {
71 output.push('↹');
67 output.push('↹');
72 } else {
68 } else {
73 output.push('├');
69 output.push('├');
74− output.push_str(&"─".repeat(tab_stop - 2));
70+ output.push_str(&"─".repeat(tab_width - 2));
75 output.push('┤');
71 output.push('┤');
76 }
72 }
77 }
73 }
78 // line feed
74 // line feed
79− '\x0A' => {
75+ '\x0A' => output.push('␊'),
80− output.push_str("␊\x0A");
81− line_idx = 0;
82− }
83 // carriage return
76 // carriage return
84 '\x0D' => output.push('␍'),
77 '\x0D' => output.push('␍'),
85 // null
78 // null
src/pretty_printer.rs+63−47
@@ -1,5 +1,5 @@
1+use std::ffi::OsStr;
1use std::io::Read;
2use std::io::Read;
2−use std::path::Path;
3
3
4use console::Term;
4use console::Term;
5use syntect::parsing::SyntaxReference;
5use syntect::parsing::SyntaxReference;
@@ -23,7 +23,6 @@ struct ActiveStyleComponents {
23 header: bool,
23 header: bool,
24 vcs_modification_markers: bool,
24 vcs_modification_markers: bool,
25 grid: bool,
25 grid: bool,
26− rule: bool,
27 line_numbers: bool,
26 line_numbers: bool,
28 snip: bool,
27 snip: bool,
29}
28}
@@ -40,11 +39,10 @@ pub struct PrettyPrinter<'a> {
40
39
41impl<'a> PrettyPrinter<'a> {
40impl<'a> PrettyPrinter<'a> {
42 pub fn new() -> Self {
41 pub fn new() -> Self {
43− let config = Config {
42+ let mut config = Config::default();
44− colored_output: true,
43+
45− true_color: true,
44+ config.colored_output = true;
46− ..Default::default()
45+ config.true_color = true;
47− };
48
46
49 PrettyPrinter {
47 PrettyPrinter {
50 inputs: vec![],
48 inputs: vec![],
@@ -72,7 +70,7 @@ impl<'a> PrettyPrinter<'a> {
72 }
70 }
73
71
74 /// Add a file which should be pretty-printed
72 /// Add a file which should be pretty-printed
75− pub fn input_file(&mut self, path: impl AsRef<Path>) -> &mut Self {
73+ pub fn input_file(&mut self, path: impl AsRef<OsStr>) -> &mut Self {
76 self.input(Input::from_file(path).kind("File"))
74 self.input(Input::from_file(path).kind("File"))
77 }
75 }
78
76
@@ -80,7 +78,7 @@ impl<'a> PrettyPrinter<'a> {
80 pub fn input_files<I, P>(&mut self, paths: I) -> &mut Self
78 pub fn input_files<I, P>(&mut self, paths: I) -> &mut Self
81 where
79 where
82 I: IntoIterator<Item = P>,
80 I: IntoIterator<Item = P>,
83− P: AsRef<Path>,
81+ P: AsRef<OsStr>,
84 {
82 {
85 self.inputs(paths.into_iter().map(Input::from_file))
83 self.inputs(paths.into_iter().map(Input::from_file))
86 }
84 }
@@ -91,17 +89,48 @@ impl<'a> PrettyPrinter<'a> {
91 self
89 self
92 }
90 }
93
91
92+ /// Add STDIN as an input (with customized name)
93+ #[deprecated]
94+ pub fn input_stdin_with_name(&mut self, name: impl AsRef<OsStr>) -> &mut Self {
95+ self.inputs
96+ .push(Input::from_stdin().name(name).kind("File"));
97+ self
98+ }
99+
94 /// Add a byte string as an input
100 /// Add a byte string as an input
95 pub fn input_from_bytes(&mut self, content: &'a [u8]) -> &mut Self {
101 pub fn input_from_bytes(&mut self, content: &'a [u8]) -> &mut Self {
96 self.input_from_reader(content)
102 self.input_from_reader(content)
97 }
103 }
98
104
105+ /// Add a byte string as an input (with customized name)
106+ #[deprecated]
107+ #[allow(deprecated)]
108+ pub fn input_from_bytes_with_name(
109+ &mut self,
110+ content: &'a [u8],
111+ name: impl AsRef<OsStr>,
112+ ) -> &mut Self {
113+ self.input_from_reader_with_name(content, name)
114+ }
115+
99 /// Add a custom reader as an input
116 /// Add a custom reader as an input
100 pub fn input_from_reader<R: Read + 'a>(&mut self, reader: R) -> &mut Self {
117 pub fn input_from_reader<R: Read + 'a>(&mut self, reader: R) -> &mut Self {
101 self.inputs.push(Input::from_reader(reader));
118 self.inputs.push(Input::from_reader(reader));
102 self
119 self
103 }
120 }
104
121
122+ /// Add a custom reader as an input (with customized name)
123+ #[deprecated]
124+ pub fn input_from_reader_with_name<R: Read + 'a>(
125+ &mut self,
126+ reader: R,
127+ name: impl AsRef<OsStr>,
128+ ) -> &mut Self {
129+ self.inputs
130+ .push(Input::from_reader(reader).name(name).kind("File"));
131+ self
132+ }
133+
105 /// Specify the syntax file which should be used (default: auto-detect)
134 /// Specify the syntax file which should be used (default: auto-detect)
106 pub fn language(&mut self, language: &'a str) -> &mut Self {
135 pub fn language(&mut self, language: &'a str) -> &mut Self {
107 self.config.language = Some(language);
136 self.config.language = Some(language);
@@ -150,23 +179,21 @@ impl<'a> PrettyPrinter<'a> {
150 self
179 self
151 }
180 }
152
181
153− /// Whether to paint a horizontal rule to delimit files
154− pub fn rule(&mut self, yes: bool) -> &mut Self {
155− self.active_style_components.rule = yes;
156− self
157− }
158−
159 /// Whether to show modification markers for VCS changes. This has no effect if
182 /// Whether to show modification markers for VCS changes. This has no effect if
160 /// the `git` feature is not activated.
183 /// the `git` feature is not activated.
161− #[cfg(feature = "git")]
184+ #[cfg_attr(
185+ not(feature = "git"),
186+ deprecated(
187+ note = "Using vcs_modification_markers without the 'git' feature has no effect. \
188+ The function will be removed (for non-'git' use cases) in the future."
189+ )
190+ )]
191+ #[allow(unused_variables)]
162 pub fn vcs_modification_markers(&mut self, yes: bool) -> &mut Self {
192 pub fn vcs_modification_markers(&mut self, yes: bool) -> &mut Self {
163− self.active_style_components.vcs_modification_markers = yes;
193+ #[cfg(feature = "git")]
164− self
194+ {
165− }
195+ self.active_style_components.vcs_modification_markers = yes;
166−
196+ }
167− /// Whether to print binary content or nonprintable characters (default: no)
168− pub fn show_nonprintable(&mut self, yes: bool) -> &mut Self {
169− self.config.show_nonprintable = yes;
170 self
197 self
171 }
198 }
172
199
@@ -241,9 +268,7 @@ impl<'a> PrettyPrinter<'a> {
241 }
268 }
242
269
243 pub fn syntaxes(&self) -> impl Iterator<Item = &SyntaxReference> {
270 pub fn syntaxes(&self) -> impl Iterator<Item = &SyntaxReference> {
244− // We always use assets from the binary, which are guaranteed to always
271+ self.assets.syntaxes().iter()
245− // be valid, so get_syntaxes() can never fail here
246− self.assets.get_syntaxes().unwrap().iter()
247 }
272 }
248
273
249 /// Pretty-print all specified inputs. This method will "use" all stored inputs.
274 /// Pretty-print all specified inputs. This method will "use" all stored inputs.
@@ -260,9 +285,6 @@ impl<'a> PrettyPrinter<'a> {
260 if self.active_style_components.grid {
285 if self.active_style_components.grid {
261 style_components.push(StyleComponent::Grid);
286 style_components.push(StyleComponent::Grid);
262 }
287 }
263− if self.active_style_components.rule {
264− style_components.push(StyleComponent::Rule);
265− }
266 if self.active_style_components.header {
288 if self.active_style_components.header {
267 style_components.push(StyleComponent::Header);
289 style_components.push(StyleComponent::Header);
268 }
290 }
@@ -288,12 +310,6 @@ impl<'a> PrettyPrinter<'a> {
288 }
310 }
289}
311}
290
312
291−impl Default for PrettyPrinter<'_> {
292− fn default() -> Self {
293− Self::new()
294− }
295−}
296−
297/// An input source for the pretty printer.
313/// An input source for the pretty printer.
298pub struct Input<'a> {
314pub struct Input<'a> {
299 input: input::Input<'a>,
315 input: input::Input<'a>,
@@ -306,13 +322,13 @@ impl<'a> Input<'a> {
306 }
322 }
307
323
308 /// A new input from a file.
324 /// A new input from a file.
309− pub fn from_file(path: impl AsRef<Path>) -> Self {
325+ pub fn from_file(path: impl AsRef<OsStr>) -> Self {
310− input::Input::ordinary_file(path).into()
326+ input::Input::ordinary_file(path.as_ref()).into()
311 }
327 }
312
328
313 /// A new input from bytes.
329 /// A new input from bytes.
314 pub fn from_bytes(bytes: &'a [u8]) -> Self {
330 pub fn from_bytes(bytes: &'a [u8]) -> Self {
315− Input::from_reader(bytes)
331+ Input::from_reader(bytes).into()
316 }
332 }
317
333
318 /// A new input from STDIN.
334 /// A new input from STDIN.
@@ -322,8 +338,8 @@ impl<'a> Input<'a> {
322
338
323 /// The filename of the input.
339 /// The filename of the input.
324 /// This affects syntax detection and changes the default header title.
340 /// This affects syntax detection and changes the default header title.
325− pub fn name(mut self, name: impl AsRef<Path>) -> Self {
341+ pub fn name(mut self, name: impl AsRef<OsStr>) -> Self {
326− self.input = self.input.with_name(Some(name));
342+ self.input = self.input.with_name(Some(name.as_ref()));
327 self
343 self
328 }
344 }
329
345
@@ -336,7 +352,7 @@ impl<'a> Input<'a> {
336 self
352 self
337 }
353 }
338
354
339− /// The title for the input (e.g. "Descriptive title")
355+ /// The title for the input (e.g. "http://example.com/example.txt")
340 /// This defaults to the file name.
356 /// This defaults to the file name.
341 pub fn title(mut self, title: impl Into<String>) -> Self {
357 pub fn title(mut self, title: impl Into<String>) -> Self {
342 self.input.description_mut().set_title(Some(title.into()));
358 self.input.description_mut().set_title(Some(title.into()));
@@ -344,14 +360,14 @@ impl<'a> Input<'a> {
344 }
360 }
345}
361}
346
362
347−impl<'a> From<input::Input<'a>> for Input<'a> {
363+impl<'a> Into<Input<'a>> for input::Input<'a> {
348− fn from(input: input::Input<'a>) -> Self {
364+ fn into(self) -> Input<'a> {
349− Self { input }
365+ Input { input: self }
350 }
366 }
351}
367}
352
368
353−impl<'a> From<Input<'a>> for input::Input<'a> {
369+impl<'a> Into<input::Input<'a>> for Input<'a> {
354− fn from(Input { input }: Input<'a>) -> Self {
370+ fn into(self) -> input::Input<'a> {
355− input
371+ self.input
356 }
372 }
357}
373}
src/printer.rs+152−237
@@ -4,8 +4,6 @@ use std::vec::Vec;
4use ansi_term::Colour::{Fixed, Green, Red, Yellow};
4use ansi_term::Colour::{Fixed, Green, Red, Yellow};
5use ansi_term::Style;
5use ansi_term::Style;
6
6
7−use bytesize::ByteSize;
8−
9use console::AnsiCodeIterator;
7use console::AnsiCodeIterator;
10
8
11use syntect::easy::HighlightLines;
9use syntect::easy::HighlightLines;
@@ -20,7 +18,7 @@ use encoding::{DecoderTrap, Encoding};
20
18
21use unicode_width::UnicodeWidthChar;
19use unicode_width::UnicodeWidthChar;
22
20
23−use crate::assets::{HighlightingAssets, SyntaxReferenceInSet};
21+use crate::assets::HighlightingAssets;
24use crate::config::Config;
22use crate::config::Config;
25#[cfg(feature = "git")]
23#[cfg(feature = "git")]
26use crate::decorations::LineChangesDecoration;
24use crate::decorations::LineChangesDecoration;
@@ -31,9 +29,7 @@ use crate::error::*;
31use crate::input::OpenedInput;
29use crate::input::OpenedInput;
32use crate::line_range::RangeCheckResult;
30use crate::line_range::RangeCheckResult;
33use crate::preprocessor::{expand_tabs, replace_nonprintable};
31use crate::preprocessor::{expand_tabs, replace_nonprintable};
34−use crate::style::StyleComponent;
35use crate::terminal::{as_terminal_escaped, to_ansi_color};
32use crate::terminal::{as_terminal_escaped, to_ansi_color};
36−use crate::vscreen::AnsiStyle;
37use crate::wrapping::WrappingMode;
33use crate::wrapping::WrappingMode;
38
34
39pub(crate) trait Printer {
35pub(crate) trait Printer {
@@ -95,6 +91,9 @@ impl<'a> Printer for SimplePrinter<'a> {
95 if self.config.show_nonprintable {
91 if self.config.show_nonprintable {
96 let line = replace_nonprintable(line_buffer, self.config.tab_width);
92 let line = replace_nonprintable(line_buffer, self.config.tab_width);
97 write!(handle, "{}", line)?;
93 write!(handle, "{}", line)?;
94+ if line_buffer.last() == Some(&b'\n') {
95+ writeln!(handle)?;
96+ }
98 } else {
97 } else {
99 handle.write_all(line_buffer)?
98 handle.write_all(line_buffer)?
100 };
99 };
@@ -103,30 +102,17 @@ impl<'a> Printer for SimplePrinter<'a> {
103 }
102 }
104}
103}
105
104
106−struct HighlighterFromSet<'a> {
107− highlighter: HighlightLines<'a>,
108− syntax_set: &'a SyntaxSet,
109−}
110−
111−impl<'a> HighlighterFromSet<'a> {
112− fn new(syntax_in_set: SyntaxReferenceInSet<'a>, theme: &'a Theme) -> Self {
113− Self {
114− highlighter: HighlightLines::new(syntax_in_set.syntax, theme),
115− syntax_set: syntax_in_set.syntax_set,
116− }
117− }
118−}
119−
120pub(crate) struct InteractivePrinter<'a> {
105pub(crate) struct InteractivePrinter<'a> {
121 colors: Colors,
106 colors: Colors,
122 config: &'a Config<'a>,
107 config: &'a Config<'a>,
123 decorations: Vec<Box<dyn Decoration>>,
108 decorations: Vec<Box<dyn Decoration>>,
124 panel_width: usize,
109 panel_width: usize,
125− ansi_style: AnsiStyle,
110+ ansi_prefix_sgr: String,
126 content_type: Option<ContentType>,
111 content_type: Option<ContentType>,
127 #[cfg(feature = "git")]
112 #[cfg(feature = "git")]
128 pub line_changes: &'a Option<LineChanges>,
113 pub line_changes: &'a Option<LineChanges>,
129− highlighter_from_set: Option<HighlighterFromSet<'a>>,
114+ highlighter: Option<HighlightLines<'a>>,
115+ syntax_set: &'a SyntaxSet,
130 background_color_highlight: Option<Color>,
116 background_color_highlight: Option<Color>,
131}
117}
132
118
@@ -180,7 +166,7 @@ impl<'a> InteractivePrinter<'a> {
180 panel_width = 0;
166 panel_width = 0;
181 }
167 }
182
168
183− let highlighter_from_set = if input
169+ let highlighter = if input
184 .reader
170 .reader
185 .content_type
171 .content_type
186 .map_or(false, |c| c.is_binary() && !config.show_nonprintable)
172 .map_or(false, |c| c.is_binary() && !config.show_nonprintable)
@@ -188,16 +174,15 @@ impl<'a> InteractivePrinter<'a> {
188 None
174 None
189 } else {
175 } else {
190 // Determine the type of syntax for highlighting
176 // Determine the type of syntax for highlighting
191− let syntax_in_set =
177+ let syntax = match assets.get_syntax(config.language, input, &config.syntax_mapping) {
192− match assets.get_syntax(config.language, input, &config.syntax_mapping) {
178+ Ok(syntax) => syntax,
193− Ok(syntax_in_set) => syntax_in_set,
179+ Err(Error(ErrorKind::UndetectedSyntax(_), _)) => {
194− Err(Error::UndetectedSyntax(_)) => assets
180+ assets.syntax_set.find_syntax_plain_text()
195− .find_syntax_by_name("Plain Text")?
181+ }
196− .expect("A plain text syntax is available"),
182+ Err(e) => return Err(e),
197− Err(e) => return Err(e),
183+ };
198− };
184+
199−
185+ Some(HighlightLines::new(syntax, theme))
200− Some(HighlighterFromSet::new(syntax_in_set, theme))
201 };
186 };
202
187
203 Ok(InteractivePrinter {
188 Ok(InteractivePrinter {
@@ -206,26 +191,22 @@ impl<'a> InteractivePrinter<'a> {
206 config,
191 config,
207 decorations,
192 decorations,
208 content_type: input.reader.content_type,
193 content_type: input.reader.content_type,
209− ansi_style: AnsiStyle::new(),
194+ ansi_prefix_sgr: String::new(),
210 #[cfg(feature = "git")]
195 #[cfg(feature = "git")]
211 line_changes,
196 line_changes,
212− highlighter_from_set,
197+ highlighter,
198+ syntax_set: &assets.syntax_set,
213 background_color_highlight,
199 background_color_highlight,
214 })
200 })
215 }
201 }
216
202
217− fn print_horizontal_line_term(&mut self, handle: &mut dyn Write, style: Style) -> Result<()> {
218− writeln!(
219− handle,
220− "{}",
221− style.paint("─".repeat(self.config.term_width))
222− )?;
223− Ok(())
224− }
225−
226 fn print_horizontal_line(&mut self, handle: &mut dyn Write, grid_char: char) -> Result<()> {
203 fn print_horizontal_line(&mut self, handle: &mut dyn Write, grid_char: char) -> Result<()> {
227 if self.panel_width == 0 {
204 if self.panel_width == 0 {
228− self.print_horizontal_line_term(handle, self.colors.grid)?;
205+ writeln!(
206+ handle,
207+ "{}",
208+ self.colors.grid.paint("─".repeat(self.config.term_width))
209+ )?;
229 } else {
210 } else {
230 let hline = "─".repeat(self.config.term_width - (self.panel_width + 1));
211 let hline = "─".repeat(self.config.term_width - (self.panel_width + 1));
231 let hline = format!("{}{}{}", "─".repeat(self.panel_width), grid_char, hline);
212 let hline = format!("{}{}{}", "─".repeat(self.panel_width), grid_char, hline);
@@ -237,44 +218,29 @@ impl<'a> InteractivePrinter<'a> {
237
218
238 fn create_fake_panel(&self, text: &str) -> String {
219 fn create_fake_panel(&self, text: &str) -> String {
239 if self.panel_width == 0 {
220 if self.panel_width == 0 {
240− return "".to_string();
221+ "".to_string()
241− }
242−
243− let text_truncated: String = text.chars().take(self.panel_width - 1).collect();
244− let text_filled: String = format!(
245− "{}{}",
246− text_truncated,
247− " ".repeat(self.panel_width - 1 - text_truncated.len())
248− );
249− if self.config.style_components.grid() {
250− format!("{} │ ", text_filled)
251 } else {
222 } else {
252− text_filled
223+ let text_truncated: String = text.chars().take(self.panel_width - 1).collect();
253− }
224+ let text_filled: String = format!(
254− }
255−
256− fn print_header_component_indent(&mut self, handle: &mut dyn Write) -> std::io::Result<()> {
257− if self.config.style_components.grid() {
258− write!(
259− handle,
260 "{}{}",
225 "{}{}",
261− " ".repeat(self.panel_width),
226+ text_truncated,
262− self.colors
227+ " ".repeat(self.panel_width - 1 - text_truncated.len())
263− .grid
228+ );
264− .paint(if self.panel_width > 0 { "│ " } else { "" }),
229+ if self.config.style_components.grid() {
265− )
230+ format!("{} │ ", text_filled)
266− } else {
231+ } else {
267− write!(handle, "{}", " ".repeat(self.panel_width))
232+ text_filled
233+ }
268 }
234 }
269 }
235 }
270
236
271 fn preprocess(&self, text: &str, cursor: &mut usize) -> String {
237 fn preprocess(&self, text: &str, cursor: &mut usize) -> String {
272 if self.config.tab_width > 0 {
238 if self.config.tab_width > 0 {
273− return expand_tabs(text, self.config.tab_width, cursor);
239+ expand_tabs(text, self.config.tab_width, cursor)
240+ } else {
241+ *cursor += text.len();
242+ text.to_string()
274 }
243 }
275−
276− *cursor += text.len();
277− text.to_string()
278 }
244 }
279}
245}
280
246
@@ -285,10 +251,6 @@ impl<'a> Printer for InteractivePrinter<'a> {
285 input: &OpenedInput,
251 input: &OpenedInput,
286 add_header_padding: bool,
252 add_header_padding: bool,
287 ) -> Result<()> {
253 ) -> Result<()> {
288− if add_header_padding && self.config.style_components.rule() {
289− self.print_horizontal_line_term(handle, self.colors.rule)?;
290− }
291−
292 if !self.config.style_components.header() {
254 if !self.config.style_components.header() {
293 if Some(ContentType::BINARY) == self.content_type && !self.config.show_nonprintable {
255 if Some(ContentType::BINARY) == self.content_type && !self.config.show_nonprintable {
294 writeln!(
256 writeln!(
@@ -305,6 +267,24 @@ impl<'a> Printer for InteractivePrinter<'a> {
305 return Ok(());
267 return Ok(());
306 }
268 }
307
269
270+ if self.config.style_components.grid() {
271+ self.print_horizontal_line(handle, '┬')?;
272+
273+ write!(
274+ handle,
275+ "{}{}",
276+ " ".repeat(self.panel_width),
277+ self.colors
278+ .grid
279+ .paint(if self.panel_width > 0 { "│ " } else { "" }),
280+ )?;
281+ } else {
282+ if add_header_padding {
283+ writeln!(handle)?;
284+ }
285+ write!(handle, "{}", " ".repeat(self.panel_width))?;
286+ }
287+
308 let mode = match self.content_type {
288 let mode = match self.content_type {
309 Some(ContentType::BINARY) => " <BINARY>",
289 Some(ContentType::BINARY) => " <BINARY>",
310 Some(ContentType::UTF_16LE) => " <UTF-16LE>",
290 Some(ContentType::UTF_16LE) => " <UTF-16LE>",
@@ -314,60 +294,17 @@ impl<'a> Printer for InteractivePrinter<'a> {
314 };
294 };
315
295
316 let description = &input.description;
296 let description = &input.description;
317− let metadata = &input.metadata;
318−
319− // We use this iterator to have a deterministic order for
320− // header components. HashSet has arbitrary order, but Vec is ordered.
321− let header_components: Vec<StyleComponent> = [
322− (
323− StyleComponent::HeaderFilename,
324− self.config.style_components.header_filename(),
325− ),
326− (
327− StyleComponent::HeaderFilesize,
328− self.config.style_components.header_filesize(),
329− ),
330− ]
331− .iter()
332− .filter(|(_, is_enabled)| *is_enabled)
333− .map(|(component, _)| *component)
334− .collect();
335−
336− // Print the cornering grid before the first header component
337− if self.config.style_components.grid() {
338− self.print_horizontal_line(handle, '┬')?;
339− } else {
340− // Only pad space between files, if we haven't already drawn a horizontal rule
341− if add_header_padding && !self.config.style_components.rule() {
342− writeln!(handle)?;
343− }
344− }
345−
346− header_components.iter().try_for_each(|component| {
347− self.print_header_component_indent(handle)?;
348
297
349− match component {
298+ writeln!(
350− StyleComponent::HeaderFilename => writeln!(
299+ handle,
351− handle,
300+ "{}{}{}",
352− "{}{}{}",
301+ description
353− description
302+ .kind()
354− .kind()
303+ .map(|kind| format!("{}: ", kind))
355− .map(|kind| format!("{}: ", kind))
304+ .unwrap_or("".into()),
356− .unwrap_or_else(|| "".into()),
305+ self.colors.filename.paint(description.title()),
357− self.colors.header_value.paint(description.title()),
306+ mode
358− mode
307+ )?;
359− ),
360−
361− StyleComponent::HeaderFilesize => {
362− let bsize = metadata
363− .size
364− .map(|s| format!("{}", ByteSize(s)))
365− .unwrap_or_else(|| "-".into());
366− writeln!(handle, "Size: {}", self.colors.header_value.paint(bsize))
367− }
368− _ => Ok(()),
369− }
370− })?;
371
308
372 if self.config.style_components.grid() {
309 if self.config.style_components.grid() {
373 if self.content_type.map_or(false, |c| c.is_text()) || self.config.show_nonprintable {
310 if self.content_type.map_or(false, |c| c.is_text()) || self.config.show_nonprintable {
@@ -422,44 +359,30 @@ impl<'a> Printer for InteractivePrinter<'a> {
422 line_buffer: &[u8],
359 line_buffer: &[u8],
423 ) -> Result<()> {
360 ) -> Result<()> {
424 let line = if self.config.show_nonprintable {
361 let line = if self.config.show_nonprintable {
425− replace_nonprintable(line_buffer, self.config.tab_width)
362+ replace_nonprintable(&line_buffer, self.config.tab_width)
426 } else {
363 } else {
427 match self.content_type {
364 match self.content_type {
428 Some(ContentType::BINARY) | None => {
365 Some(ContentType::BINARY) | None => {
429 return Ok(());
366 return Ok(());
430 }
367 }
431 Some(ContentType::UTF_16LE) => UTF_16LE
368 Some(ContentType::UTF_16LE) => UTF_16LE
432− .decode(line_buffer, DecoderTrap::Replace)
369+ .decode(&line_buffer, DecoderTrap::Replace)
433 .map_err(|_| "Invalid UTF-16LE")?,
370 .map_err(|_| "Invalid UTF-16LE")?,
434 Some(ContentType::UTF_16BE) => UTF_16BE
371 Some(ContentType::UTF_16BE) => UTF_16BE
435− .decode(line_buffer, DecoderTrap::Replace)
372+ .decode(&line_buffer, DecoderTrap::Replace)
436 .map_err(|_| "Invalid UTF-16BE")?,
373 .map_err(|_| "Invalid UTF-16BE")?,
437− _ => String::from_utf8_lossy(line_buffer).to_string(),
374+ _ => String::from_utf8_lossy(&line_buffer).to_string(),
438 }
375 }
439 };
376 };
440
377
441 let regions = {
378 let regions = {
442− let highlighter_from_set = match self.highlighter_from_set {
379+ let highlighter = match self.highlighter {
443− Some(ref mut highlighter_from_set) => highlighter_from_set,
380+ Some(ref mut highlighter) => highlighter,
444 _ => {
381 _ => {
445 return Ok(());
382 return Ok(());
446 }
383 }
447 };
384 };
448−
385+ highlighter.highlight(line.as_ref(), self.syntax_set)
449− // skip syntax highlighting on long lines
450− let too_long = line.len() > 1024 * 16;
451−
452− let for_highlighting: &str = if too_long { "\n" } else { &line };
453−
454− let mut highlighted_line = highlighter_from_set
455− .highlighter
456− .highlight_line(for_highlighting, highlighter_from_set.syntax_set)?;
457−
458− if too_long {
459− highlighted_line[0].1 = &line;
460− }
461−
462− highlighted_line
463 };
386 };
464
387
465 if out_of_range {
388 if out_of_range {
@@ -475,10 +398,6 @@ impl<'a> Printer for InteractivePrinter<'a> {
475 let highlight_this_line =
398 let highlight_this_line =
476 self.config.highlighted_lines.0.check(line_number) == RangeCheckResult::InRange;
399 self.config.highlighted_lines.0.check(line_number) == RangeCheckResult::InRange;
477
400
478− if highlight_this_line && self.config.theme == "ansi" {
479− self.ansi_style.update("^[4m");
480− }
481−
482 let background_color = self
401 let background_color = self
483 .background_color_highlight
402 .background_color_highlight
484 .filter(|_| highlight_this_line);
403 .filter(|_| highlight_this_line);
@@ -488,7 +407,8 @@ impl<'a> Printer for InteractivePrinter<'a> {
488 let decorations = self
407 let decorations = self
489 .decorations
408 .decorations
490 .iter()
409 .iter()
491− .map(|d| d.generate(line_number, false, self));
410+ .map(|ref d| d.generate(line_number, false, self))
411+ .collect::<Vec<_>>();
492
412
493 for deco in decorations {
413 for deco in decorations {
494 write!(handle, "{} ", deco.text)?;
414 write!(handle, "{} ", deco.text)?;
@@ -497,72 +417,73 @@ impl<'a> Printer for InteractivePrinter<'a> {
497 }
417 }
498
418
499 // Line contents.
419 // Line contents.
500− if matches!(self.config.wrapping_mode, WrappingMode::NoWrapping(_)) {
420+ if self.config.wrapping_mode == WrappingMode::NoWrapping {
501 let true_color = self.config.true_color;
421 let true_color = self.config.true_color;
502 let colored_output = self.config.colored_output;
422 let colored_output = self.config.colored_output;
503 let italics = self.config.use_italic_text;
423 let italics = self.config.use_italic_text;
504
424
505− for &(style, region) in &regions {
425+ for &(style, region) in regions.iter() {
506− let ansi_iterator = AnsiCodeIterator::new(region);
426+ let text = &*self.preprocess(region, &mut cursor_total);
507− for chunk in ansi_iterator {
427+ let text_trimmed = text.trim_end_matches(|c| c == '\r' || c == '\n');
508− match chunk {
428+ write!(
509− // ANSI escape passthrough.
429+ handle,
510− (ansi, true) => {
430+ "{}",
511− self.ansi_style.update(ansi);
431+ as_terminal_escaped(
512− write!(handle, "{}", ansi)?;
432+ style,
513− }
433+ text_trimmed,
514−
434+ true_color,
515− // Regular text.
435+ colored_output,
516− (text, false) => {
436+ italics,
517− let text = &*self.preprocess(text, &mut cursor_total);
437+ background_color
518− let text_trimmed = text.trim_end_matches(|c| c == '\r' || c == '\n');
438+ )
519−
439+ )?;
520− write!(
521− handle,
522− "{}",
523− as_terminal_escaped(
524− style,
525− &format!("{}{}", self.ansi_style, text_trimmed),
526− true_color,
527− colored_output,
528− italics,
529− background_color
530− )
531− )?;
532
440
533− if text.len() != text_trimmed.len() {
441+ if text.len() != text_trimmed.len() {
534− if let Some(background_color) = background_color {
442+ if let Some(background_color) = background_color {
535− let ansi_style = Style {
443+ let mut ansi_style = Style::default();
536− background: to_ansi_color(background_color, true_color),
444+ ansi_style.background = Some(to_ansi_color(background_color, true_color));
537− ..Default::default()
445+ let width = if cursor_total <= cursor_max {
538− };
446+ cursor_max - cursor_total + 1
539−
447+ } else {
540− let width = if cursor_total <= cursor_max {
448+ 0
541− cursor_max - cursor_total + 1
449+ };
542− } else {
450+ write!(handle, "{}", ansi_style.paint(" ".repeat(width)))?;
543− 0
544− };
545− write!(handle, "{}", ansi_style.paint(" ".repeat(width)))?;
546− }
547− write!(handle, "{}", &text[text_trimmed.len()..])?;
548− }
549− }
550 }
451 }
452+ write!(handle, "{}", &text[text_trimmed.len()..])?;
551 }
453 }
552 }
454 }
553
455
554− if !self.config.style_components.plain() && line.bytes().next_back() != Some(b'\n') {
456+ if line.bytes().next_back() != Some(b'\n') {
555 writeln!(handle)?;
457 writeln!(handle)?;
556 }
458 }
557 } else {
459 } else {
558− for &(style, region) in &regions {
460+ for &(style, region) in regions.iter() {
559 let ansi_iterator = AnsiCodeIterator::new(region);
461 let ansi_iterator = AnsiCodeIterator::new(region);
462+ let mut ansi_prefix: String = String::new();
560 for chunk in ansi_iterator {
463 for chunk in ansi_iterator {
561 match chunk {
464 match chunk {
562 // ANSI escape passthrough.
465 // ANSI escape passthrough.
563− (ansi, true) => {
466+ (text, true) => {
564− self.ansi_style.update(ansi);
467+ let is_ansi_csi = text.starts_with("\x1B[");
565− write!(handle, "{}", ansi)?;
468+
469+ if is_ansi_csi && text.ends_with('m') {
470+ // It's an ANSI SGR sequence.
471+ // We should be mostly safe to just append these together.
472+ ansi_prefix.push_str(text);
473+ if text == "\x1B[0m" {
474+ self.ansi_prefix_sgr = "\x1B[0m".to_owned();
475+ } else {
476+ self.ansi_prefix_sgr.push_str(text);
477+ }
478+ } else if is_ansi_csi {
479+ // It's a regular CSI sequence.
480+ // We should be mostly safe to just append these together.
481+ ansi_prefix.push_str(text);
482+ } else {
483+ // It's probably a VT100 code.
484+ // Passing it through is the safest bet.
485+ write!(handle, "{}", text)?;
486+ }
566 }
487 }
567
488
568 // Regular text.
489 // Regular text.
@@ -595,7 +516,7 @@ impl<'a> Printer for InteractivePrinter<'a> {
595 "{} ",
516 "{} ",
596 self.decorations
517 self.decorations
597 .iter()
518 .iter()
598− .map(|d| d
519+ .map(|ref d| d
599 .generate(line_number, true, self)
520 .generate(line_number, true, self)
600 .text)
521 .text)
601 .collect::<Vec<String>>()
522 .collect::<Vec<String>>()
@@ -612,7 +533,10 @@ impl<'a> Printer for InteractivePrinter<'a> {
612 "{}\n{}",
533 "{}\n{}",
613 as_terminal_escaped(
534 as_terminal_escaped(
614 style,
535 style,
615− &*format!("{}{}", self.ansi_style, line_buf),
536+ &*format!(
537+ "{}{}{}",
538+ self.ansi_prefix_sgr, ansi_prefix, line_buf
539+ ),
616 self.config.true_color,
540 self.config.true_color,
617 self.config.colored_output,
541 self.config.colored_output,
618 self.config.use_italic_text,
542 self.config.use_italic_text,
@@ -638,23 +562,28 @@ impl<'a> Printer for InteractivePrinter<'a> {
638 "{}",
562 "{}",
639 as_terminal_escaped(
563 as_terminal_escaped(
640 style,
564 style,
641− &*format!("{}{}", self.ansi_style, line_buf),
565+ &*format!(
566+ "{}{}{}",
567+ self.ansi_prefix_sgr, ansi_prefix, line_buf
568+ ),
642 self.config.true_color,
569 self.config.true_color,
643 self.config.colored_output,
570 self.config.colored_output,
644 self.config.use_italic_text,
571 self.config.use_italic_text,
645 background_color
572 background_color
646 )
573 )
647 )?;
574 )?;
575+
576+ // Clear the ANSI prefix buffer.
577+ ansi_prefix.clear();
648 }
578 }
649 }
579 }
650 }
580 }
651 }
581 }
652
582
653 if let Some(background_color) = background_color {
583 if let Some(background_color) = background_color {
654− let ansi_style = Style {
584+ let mut ansi_style = Style::default();
655− background: to_ansi_color(background_color, self.config.true_color),
585+ ansi_style.background =
656− ..Default::default()
586+ Some(to_ansi_color(background_color, self.config.true_color));
657− };
658
587
659 write!(
588 write!(
660 handle,
589 handle,
@@ -665,11 +594,6 @@ impl<'a> Printer for InteractivePrinter<'a> {
665 writeln!(handle)?;
594 writeln!(handle)?;
666 }
595 }
667
596
668− if highlight_this_line && self.config.theme == "ansi" {
669− self.ansi_style.update("^[24m");
670− write!(handle, "\x1B[24m")?;
671− }
672−
673 Ok(())
597 Ok(())
674 }
598 }
675}
599}
@@ -679,8 +603,7 @@ const DEFAULT_GUTTER_COLOR: u8 = 238;
679#[derive(Debug, Default)]
603#[derive(Debug, Default)]
680pub struct Colors {
604pub struct Colors {
681 pub grid: Style,
605 pub grid: Style,
682− pub rule: Style,
606+ pub filename: Style,
683− pub header_value: Style,
684 pub git_added: Style,
607 pub git_added: Style,
685 pub git_removed: Style,
608 pub git_removed: Style,
686 pub git_modified: Style,
609 pub git_modified: Style,
@@ -693,27 +616,19 @@ impl Colors {
693 }
616 }
694
617
695 fn colored(theme: &Theme, true_color: bool) -> Self {
618 fn colored(theme: &Theme, true_color: bool) -> Self {
696− let gutter_style = Style {
619+ let gutter_color = theme
697− foreground: match theme.settings.gutter_foreground {
620+ .settings
698− // If the theme provides a gutter foreground color, use it.
621+ .gutter_foreground
699− // Note: It might be the special value #00000001, in which case
622+ .map(|c| to_ansi_color(c, true_color))
700− // to_ansi_color returns None and we use an empty Style
623+ .unwrap_or(Fixed(DEFAULT_GUTTER_COLOR));
701− // (resulting in the terminal's default foreground color).
702− Some(c) => to_ansi_color(c, true_color),
703− // Otherwise, use a specific fallback color.
704− None => Some(Fixed(DEFAULT_GUTTER_COLOR)),
705− },
706− ..Style::default()
707− };
708
624
709 Colors {
625 Colors {
710− grid: gutter_style,
626+ grid: gutter_color.normal(),
711− rule: gutter_style,
627+ filename: Style::new().bold(),
712− header_value: Style::new().bold(),
713 git_added: Green.normal(),
628 git_added: Green.normal(),
714 git_removed: Red.normal(),
629 git_removed: Red.normal(),
715 git_modified: Yellow.normal(),
630 git_modified: Yellow.normal(),
716− line_number: gutter_style,
631+ line_number: gutter_color.normal(),
717 }
632 }
718 }
633 }
719}
634}
src/style.rs+4−37
@@ -3,21 +3,16 @@ use std::str::FromStr;
3
3
4use crate::error::*;
4use crate::error::*;
5
5
6−#[non_exhaustive]
7#[derive(Debug, Eq, PartialEq, Copy, Clone, Hash)]
6#[derive(Debug, Eq, PartialEq, Copy, Clone, Hash)]
8pub enum StyleComponent {
7pub enum StyleComponent {
9 Auto,
8 Auto,
10 #[cfg(feature = "git")]
9 #[cfg(feature = "git")]
11 Changes,
10 Changes,
12 Grid,
11 Grid,
13− Rule,
14 Header,
12 Header,
15− HeaderFilename,
16− HeaderFilesize,
17 LineNumbers,
13 LineNumbers,
18 Snip,
14 Snip,
19 Full,
15 Full,
20− Default,
21 Plain,
16 Plain,
22}
17}
23
18
@@ -26,7 +21,7 @@ impl StyleComponent {
26 match self {
21 match self {
27 StyleComponent::Auto => {
22 StyleComponent::Auto => {
28 if interactive_terminal {
23 if interactive_terminal {
29− StyleComponent::Default.components(interactive_terminal)
24+ StyleComponent::Full.components(interactive_terminal)
30 } else {
25 } else {
31 StyleComponent::Plain.components(interactive_terminal)
26 StyleComponent::Plain.components(interactive_terminal)
32 }
27 }
@@ -34,26 +29,14 @@ impl StyleComponent {
34 #[cfg(feature = "git")]
29 #[cfg(feature = "git")]
35 StyleComponent::Changes => &[StyleComponent::Changes],
30 StyleComponent::Changes => &[StyleComponent::Changes],
36 StyleComponent::Grid => &[StyleComponent::Grid],
31 StyleComponent::Grid => &[StyleComponent::Grid],
37− StyleComponent::Rule => &[StyleComponent::Rule],
32+ StyleComponent::Header => &[StyleComponent::Header],
38− StyleComponent::Header => &[StyleComponent::HeaderFilename],
39− StyleComponent::HeaderFilename => &[StyleComponent::HeaderFilename],
40− StyleComponent::HeaderFilesize => &[StyleComponent::HeaderFilesize],
41 StyleComponent::LineNumbers => &[StyleComponent::LineNumbers],
33 StyleComponent::LineNumbers => &[StyleComponent::LineNumbers],
42 StyleComponent::Snip => &[StyleComponent::Snip],
34 StyleComponent::Snip => &[StyleComponent::Snip],
43 StyleComponent::Full => &[
35 StyleComponent::Full => &[
44 #[cfg(feature = "git")]
36 #[cfg(feature = "git")]
45 StyleComponent::Changes,
37 StyleComponent::Changes,
46 StyleComponent::Grid,
38 StyleComponent::Grid,
47− StyleComponent::HeaderFilename,
39+ StyleComponent::Header,
48− StyleComponent::HeaderFilesize,
49− StyleComponent::LineNumbers,
50− StyleComponent::Snip,
51− ],
52− StyleComponent::Default => &[
53− #[cfg(feature = "git")]
54− StyleComponent::Changes,
55− StyleComponent::Grid,
56− StyleComponent::HeaderFilename,
57 StyleComponent::LineNumbers,
40 StyleComponent::LineNumbers,
58 StyleComponent::Snip,
41 StyleComponent::Snip,
59 ],
42 ],
@@ -71,14 +54,10 @@ impl FromStr for StyleComponent {
71 #[cfg(feature = "git")]
54 #[cfg(feature = "git")]
72 "changes" => Ok(StyleComponent::Changes),
55 "changes" => Ok(StyleComponent::Changes),
73 "grid" => Ok(StyleComponent::Grid),
56 "grid" => Ok(StyleComponent::Grid),
74− "rule" => Ok(StyleComponent::Rule),
75 "header" => Ok(StyleComponent::Header),
57 "header" => Ok(StyleComponent::Header),
76− "header-filename" => Ok(StyleComponent::HeaderFilename),
77− "header-filesize" => Ok(StyleComponent::HeaderFilesize),
78 "numbers" => Ok(StyleComponent::LineNumbers),
58 "numbers" => Ok(StyleComponent::LineNumbers),
79 "snip" => Ok(StyleComponent::Snip),
59 "snip" => Ok(StyleComponent::Snip),
80 "full" => Ok(StyleComponent::Full),
60 "full" => Ok(StyleComponent::Full),
81− "default" => Ok(StyleComponent::Default),
82 "plain" => Ok(StyleComponent::Plain),
61 "plain" => Ok(StyleComponent::Plain),
83 _ => Err(format!("Unknown style '{}'", s).into()),
62 _ => Err(format!("Unknown style '{}'", s).into()),
84 }
63 }
@@ -102,20 +81,8 @@ impl StyleComponents {
102 self.0.contains(&StyleComponent::Grid)
81 self.0.contains(&StyleComponent::Grid)
103 }
82 }
104
83
105− pub fn rule(&self) -> bool {
106− self.0.contains(&StyleComponent::Rule)
107− }
108−
109 pub fn header(&self) -> bool {
84 pub fn header(&self) -> bool {
110− self.header_filename() || self.header_filesize()
85+ self.0.contains(&StyleComponent::Header)
111− }
112−
113− pub fn header_filename(&self) -> bool {
114− self.0.contains(&StyleComponent::HeaderFilename)
115− }
116−
117− pub fn header_filesize(&self) -> bool {
118− self.0.contains(&StyleComponent::HeaderFilesize)
119 }
86 }
120
87
121 pub fn numbers(&self) -> bool {
88 pub fn numbers(&self) -> bool {
src/syntax_mapping.rs+8−53
@@ -1,36 +1,18 @@
1use std::path::Path;
1use std::path::Path;
2
2
3use crate::error::Result;
3use crate::error::Result;
4−use ignored_suffixes::IgnoredSuffixes;
5
4
6use globset::{Candidate, GlobBuilder, GlobMatcher};
5use globset::{Candidate, GlobBuilder, GlobMatcher};
7
6
8−pub mod ignored_suffixes;
9−
10#[derive(Debug, Clone, Copy, PartialEq)]
7#[derive(Debug, Clone, Copy, PartialEq)]
11−#[non_exhaustive]
12pub enum MappingTarget<'a> {
8pub enum MappingTarget<'a> {
13− /// For mapping a path to a specific syntax.
14 MapTo(&'a str),
9 MapTo(&'a str),
15−
16− /// For mapping a path (typically an extension-less file name) to an unknown
17− /// syntax. This typically means later using the contents of the first line
18− /// of the file to determine what syntax to use.
19 MapToUnknown,
10 MapToUnknown,
20−
21− /// For mapping a file extension (e.g. `*.conf`) to an unknown syntax. This
22− /// typically means later using the contents of the first line of the file
23− /// to determine what syntax to use. However, if a syntax handles a file
24− /// name that happens to have the given file extension (e.g. `resolv.conf`),
25− /// then that association will have higher precedence, and the mapping will
26− /// be ignored.
27− MapExtensionToUnknown,
28}
11}
29
12
30#[derive(Debug, Clone, Default)]
13#[derive(Debug, Clone, Default)]
31pub struct SyntaxMapping<'a> {
14pub struct SyntaxMapping<'a> {
32 mappings: Vec<(GlobMatcher, MappingTarget<'a>)>,
15 mappings: Vec<(GlobMatcher, MappingTarget<'a>)>,
33− pub(crate) ignored_suffixes: IgnoredSuffixes<'a>,
34}
16}
35
17
36impl<'a> SyntaxMapping<'a> {
18impl<'a> SyntaxMapping<'a> {
@@ -41,9 +23,6 @@ impl<'a> SyntaxMapping<'a> {
41 pub fn builtin() -> SyntaxMapping<'a> {
23 pub fn builtin() -> SyntaxMapping<'a> {
42 let mut mapping = Self::empty();
24 let mut mapping = Self::empty();
43 mapping.insert("*.h", MappingTarget::MapTo("C++")).unwrap();
25 mapping.insert("*.h", MappingTarget::MapTo("C++")).unwrap();
44− mapping
45− .insert(".clang-format", MappingTarget::MapTo("YAML"))
46− .unwrap();
47 mapping.insert("*.fs", MappingTarget::MapTo("F#")).unwrap();
26 mapping.insert("*.fs", MappingTarget::MapTo("F#")).unwrap();
48 mapping
27 mapping
49 .insert("build", MappingTarget::MapToUnknown)
28 .insert("build", MappingTarget::MapToUnknown)
@@ -63,9 +42,6 @@ impl<'a> SyntaxMapping<'a> {
63 MappingTarget::MapTo("Bourne Again Shell (bash)"),
42 MappingTarget::MapTo("Bourne Again Shell (bash)"),
64 )
43 )
65 .unwrap();
44 .unwrap();
66− mapping
67− .insert("*.pac", MappingTarget::MapTo("JavaScript (Babel)"))
68− .unwrap();
69
45
70 // See #1008
46 // See #1008
71 mapping
47 mapping
@@ -75,7 +51,7 @@ impl<'a> SyntaxMapping<'a> {
75 // Nginx and Apache syntax files both want to style all ".conf" files
51 // Nginx and Apache syntax files both want to style all ".conf" files
76 // see #1131 and #1137
52 // see #1131 and #1137
77 mapping
53 mapping
78− .insert("*.conf", MappingTarget::MapExtensionToUnknown)
54+ .insert("*.conf", MappingTarget::MapToUnknown)
79 .unwrap();
55 .unwrap();
80
56
81 for glob in &[
57 for glob in &[
@@ -97,7 +73,7 @@ impl<'a> SyntaxMapping<'a> {
97 .unwrap();
73 .unwrap();
98 }
74 }
99
75
100− for glob in &[
76+ for glob in [
101 "**/systemd/**/*.conf",
77 "**/systemd/**/*.conf",
102 "**/systemd/**/*.example",
78 "**/systemd/**/*.example",
103 "*.automount",
79 "*.automount",
@@ -116,36 +92,19 @@ impl<'a> SyntaxMapping<'a> {
116 "*.swap",
92 "*.swap",
117 "*.target",
93 "*.target",
118 "*.timer",
94 "*.timer",
119− ] {
95+ ]
96+ .iter()
97+ {
120 mapping.insert(glob, MappingTarget::MapTo("INI")).unwrap();
98 mapping.insert(glob, MappingTarget::MapTo("INI")).unwrap();
121 }
99 }
122
100
123− // unix mail spool
124− for glob in &["/var/spool/mail/*", "/var/mail/*"] {
125− mapping.insert(glob, MappingTarget::MapTo("Email")).unwrap()
126− }
127−
128 // pacman hooks
101 // pacman hooks
129 mapping
102 mapping
130 .insert("*.hook", MappingTarget::MapTo("INI"))
103 .insert("*.hook", MappingTarget::MapTo("INI"))
131 .unwrap();
104 .unwrap();
132
105
133− // Global git config files rooted in `$XDG_CONFIG_HOME/git/` or `$HOME/.config/git/`
106+ if let Some(xdg_config_home) = std::env::var_os("XDG_CONFIG_HOME") {
134− // See e.g. https://git-scm.com/docs/git-config#FILES
107+ let git_config_path = Path::new(&xdg_config_home).join("git");
135− if let Some(xdg_config_home) =
136− std::env::var_os("XDG_CONFIG_HOME").filter(|val| !val.is_empty())
137− {
138− insert_git_config_global(&mut mapping, &xdg_config_home);
139− }
140− if let Some(default_config_home) = std::env::var_os("HOME")
141− .filter(|val| !val.is_empty())
142− .map(|home| Path::new(&home).join(".config"))
143− {
144− insert_git_config_global(&mut mapping, &default_config_home);
145− }
146−
147− fn insert_git_config_global(mapping: &mut SyntaxMapping, config_home: impl AsRef<Path>) {
148− let git_config_path = config_home.as_ref().join("git");
149
108
150 mapping
109 mapping
151 .insert(
110 .insert(
@@ -186,7 +145,7 @@ impl<'a> SyntaxMapping<'a> {
186 }
145 }
187
146
188 pub(crate) fn get_syntax_for(&self, path: impl AsRef<Path>) -> Option<MappingTarget<'a>> {
147 pub(crate) fn get_syntax_for(&self, path: impl AsRef<Path>) -> Option<MappingTarget<'a>> {
189− let candidate = Candidate::new(&path);
148+ let candidate = Candidate::new(path.as_ref());
190 let candidate_filename = path.as_ref().file_name().map(Candidate::new);
149 let candidate_filename = path.as_ref().file_name().map(Candidate::new);
191 for (ref glob, ref syntax) in self.mappings.iter().rev() {
150 for (ref glob, ref syntax) in self.mappings.iter().rev() {
192 if glob.is_match_candidate(&candidate)
151 if glob.is_match_candidate(&candidate)
@@ -199,10 +158,6 @@ impl<'a> SyntaxMapping<'a> {
199 }
158 }
200 None
159 None
201 }
160 }
202−
203− pub fn insert_ignored_suffix(&mut self, suffix: &'a str) {
204− self.ignored_suffixes.add_suffix(suffix);
205− }
206}
161}
207
162
208#[test]
163#[test]
src/syntax_mapping/ignored_suffixes.rsdeleted−107
@@ -1,107 +0,0 @@
1−use std::ffi::OsStr;
2−use std::fmt::Debug;
3−use std::path::Path;
4−
5−use crate::error::*;
6−
7−#[derive(Debug, Clone)]
8−pub struct IgnoredSuffixes<'a> {
9− values: Vec<&'a str>,
10−}
11−
12−impl Default for IgnoredSuffixes<'_> {
13− fn default() -> Self {
14− Self {
15− values: vec![
16− // Editor etc backups
17− "~",
18− ".bak",
19− ".old",
20− ".orig",
21− // Debian and derivatives apt/dpkg/ucf backups
22− ".dpkg-dist",
23− ".dpkg-old",
24− ".ucf-dist",
25− ".ucf-new",
26− ".ucf-old",
27− // Red Hat and derivatives rpm backups
28− ".rpmnew",
29− ".rpmorig",
30− ".rpmsave",
31− // Build system input/template files
32− ".in",
33− ],
34− }
35− }
36−}
37−
38−impl<'a> IgnoredSuffixes<'a> {
39− pub fn add_suffix(&mut self, suffix: &'a str) {
40− self.values.push(suffix)
41− }
42−
43− pub fn strip_suffix(&self, file_name: &'a str) -> Option<&'a str> {
44− for suffix in self.values.iter() {
45− if let Some(stripped_file_name) = file_name.strip_suffix(suffix) {
46− return Some(stripped_file_name);
47− }
48− }
49− None
50− }
51−
52− /// If we find an ignored suffix on the file name, e.g. '~', we strip it and
53− /// then try again without it.
54− pub fn try_with_stripped_suffix<T, F>(&self, file_name: &'a OsStr, func: F) -> Result<Option<T>>
55− where
56− F: Fn(&'a OsStr) -> Result<Option<T>>,
57− {
58− if let Some(file_str) = Path::new(file_name).to_str() {
59− if let Some(stripped_file_name) = self.strip_suffix(file_str) {
60− return func(OsStr::new(stripped_file_name));
61− }
62− }
63− Ok(None)
64− }
65−}
66−
67−#[test]
68−fn internal_suffixes() {
69− let ignored_suffixes = IgnoredSuffixes::default();
70−
71− let file_names = ignored_suffixes
72− .values
73− .iter()
74− .map(|suffix| format!("test.json{}", suffix));
75− for file_name_str in file_names {
76− let file_name = OsStr::new(&file_name_str);
77− let expected_stripped_file_name = OsStr::new("test.json");
78− let stripped_file_name = ignored_suffixes
79− .try_with_stripped_suffix(file_name, |stripped_file_name| Ok(Some(stripped_file_name)));
80− assert_eq!(
81− expected_stripped_file_name,
82− stripped_file_name.unwrap().unwrap()
83− );
84− }
85−}
86−
87−#[test]
88−fn external_suffixes() {
89− let mut ignored_suffixes = IgnoredSuffixes::default();
90− ignored_suffixes.add_suffix(".development");
91− ignored_suffixes.add_suffix(".production");
92−
93− let file_names = ignored_suffixes
94− .values
95− .iter()
96− .map(|suffix| format!("test.json{}", suffix));
97− for file_name_str in file_names {
98− let file_name = OsStr::new(&file_name_str);
99− let expected_stripped_file_name = OsStr::new("test.json");
100− let stripped_file_name = ignored_suffixes
101− .try_with_stripped_suffix(file_name, |stripped_file_name| Ok(Some(stripped_file_name)));
102− assert_eq!(
103− expected_stripped_file_name,
104− stripped_file_name.unwrap().unwrap()
105− );
106− }
107−}
src/terminal.rs+9−19
@@ -3,13 +3,13 @@ use ansi_term::{self, Style};
3
3
4use syntect::highlighting::{self, FontStyle};
4use syntect::highlighting::{self, FontStyle};
5
5
6−pub fn to_ansi_color(color: highlighting::Color, true_color: bool) -> Option<ansi_term::Color> {
6+pub fn to_ansi_color(color: highlighting::Color, true_color: bool) -> ansi_term::Color {
7 if color.a == 0 {
7 if color.a == 0 {
8 // Themes can specify one of the user-configurable terminal colors by
8 // Themes can specify one of the user-configurable terminal colors by
9 // encoding them as #RRGGBBAA with AA set to 00 (transparent) and RR set
9 // encoding them as #RRGGBBAA with AA set to 00 (transparent) and RR set
10− // to the 8-bit color palette number. The built-in themes ansi, base16,
10+ // to the 8-bit color palette number. The built-in themes ansi-light,
11− // and base16-256 use this.
11+ // ansi-dark, base16, and base16-256 use this.
12− Some(match color.r {
12+ match color.r {
13 // For the first 8 colors, use the Color enum to produce ANSI escape
13 // For the first 8 colors, use the Color enum to produce ANSI escape
14 // sequences using codes 30-37 (foreground) and 40-47 (background).
14 // sequences using codes 30-37 (foreground) and 40-47 (background).
15 // For example, red foreground is \x1b[31m. This works on terminals
15 // For example, red foreground is \x1b[31m. This works on terminals
@@ -31,18 +31,11 @@ pub fn to_ansi_color(color: highlighting::Color, true_color: bool) -> Option<ans
31 // 90-97 (foreground) and 100-107 (background), we should use those
31 // 90-97 (foreground) and 100-107 (background), we should use those
32 // for values 0x08 to 0x0f and only use Fixed for 0x10 to 0xff.
32 // for values 0x08 to 0x0f and only use Fixed for 0x10 to 0xff.
33 n => Fixed(n),
33 n => Fixed(n),
34− })
34+ }
35− } else if color.a == 1 {
36− // Themes can specify the terminal's default foreground/background color
37− // (i.e. no escape sequence) using the encoding #RRGGBBAA with AA set to
38− // 01. The built-in theme ansi uses this.
39− None
40 } else if true_color {
35 } else if true_color {
41− Some(RGB(color.r, color.g, color.b))
36+ RGB(color.r, color.g, color.b)
42 } else {
37 } else {
43− Some(Fixed(ansi_colours::ansi256_from_rgb((
38+ Fixed(ansi_colours::ansi256_from_rgb((color.r, color.g, color.b)))
44− color.r, color.g, color.b,
45− ))))
46 }
39 }
47}
40}
48
41
@@ -61,10 +54,7 @@ pub fn as_terminal_escaped(
61 let mut style = if !colored {
54 let mut style = if !colored {
62 Style::default()
55 Style::default()
63 } else {
56 } else {
64− let mut color = Style {
57+ let mut color = Style::from(to_ansi_color(style.foreground, true_color));
65− foreground: to_ansi_color(style.foreground, true_color),
66− ..Style::default()
67− };
68 if style.font_style.contains(FontStyle::BOLD) {
58 if style.font_style.contains(FontStyle::BOLD) {
69 color = color.bold();
59 color = color.bold();
70 }
60 }
@@ -77,6 +67,6 @@ pub fn as_terminal_escaped(
77 color
67 color
78 };
68 };
79
69
80− style.background = background_color.and_then(|c| to_ansi_color(c, true_color));
70+ style.background = background_color.map(|c| to_ansi_color(c, true_color));
81 style.paint(text).to_string()
71 style.paint(text).to_string()
82}
72}
src/vscreen.rsdeleted−212
@@ -1,212 +0,0 @@
1−use std::fmt::{Display, Formatter};
2−
3−// Wrapper to avoid unnecessary branching when input doesn't have ANSI escape sequences.
4−pub struct AnsiStyle {
5− attributes: Option<Attributes>,
6−}
7−
8−impl AnsiStyle {
9− pub fn new() -> Self {
10− AnsiStyle { attributes: None }
11− }
12−
13− pub fn update(&mut self, sequence: &str) -> bool {
14− match &mut self.attributes {
15− Some(a) => a.update(sequence),
16− None => {
17− self.attributes = Some(Attributes::new());
18− self.attributes.as_mut().unwrap().update(sequence)
19− }
20− }
21− }
22−}
23−
24−impl Display for AnsiStyle {
25− fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
26− match self.attributes {
27− Some(ref a) => a.fmt(f),
28− None => Ok(()),
29− }
30− }
31−}
32−
33−struct Attributes {
34− foreground: String,
35− background: String,
36− underlined: String,
37−
38− /// The character set to use.
39− /// REGEX: `\^[()][AB0-3]`
40− charset: String,
41−
42− /// A buffer for unknown sequences.
43− unknown_buffer: String,
44−
45− /// ON: ^[1m
46− /// OFF: ^[22m
47− bold: String,
48−
49− /// ON: ^[2m
50− /// OFF: ^[22m
51− dim: String,
52−
53− /// ON: ^[4m
54− /// OFF: ^[24m
55− underline: String,
56−
57− /// ON: ^[3m
58− /// OFF: ^[23m
59− italic: String,
60−
61− /// ON: ^[9m
62− /// OFF: ^[29m
63− strike: String,
64−}
65−
66−impl Attributes {
67− pub fn new() -> Self {
68− Attributes {
69− foreground: "".to_owned(),
70− background: "".to_owned(),
71− underlined: "".to_owned(),
72− charset: "".to_owned(),
73− unknown_buffer: "".to_owned(),
74− bold: "".to_owned(),
75− dim: "".to_owned(),
76− underline: "".to_owned(),
77− italic: "".to_owned(),
78− strike: "".to_owned(),
79− }
80− }
81−
82− /// Update the attributes with an escape sequence.
83− /// Returns `false` if the sequence is unsupported.
84− pub fn update(&mut self, sequence: &str) -> bool {
85− let mut chars = sequence.char_indices().skip(1);
86−
87− if let Some((_, t)) = chars.next() {
88− match t {
89− '(' => self.update_with_charset('(', chars.map(|(_, c)| c)),
90− ')' => self.update_with_charset(')', chars.map(|(_, c)| c)),
91− '[' => {
92− if let Some((i, last)) = chars.last() {
93− // SAFETY: Always starts with ^[ and ends with m.
94− self.update_with_csi(last, &sequence[2..i])
95− } else {
96− false
97− }
98− }
99− _ => self.update_with_unsupported(sequence),
100− }
101− } else {
102− false
103− }
104− }
105−
106− fn sgr_reset(&mut self) {
107− self.foreground.clear();
108− self.background.clear();
109− self.underlined.clear();
110− self.bold.clear();
111− self.dim.clear();
112− self.underline.clear();
113− self.italic.clear();
114− self.strike.clear();
115− }
116−
117− fn update_with_sgr(&mut self, parameters: &str) -> bool {
118− let mut iter = parameters
119− .split(';')
120− .map(|p| if p.is_empty() { "0" } else { p })
121− .map(|p| p.parse::<u16>())
122− .map(|p| p.unwrap_or(0)); // Treat errors as 0.
123−
124− while let Some(p) = iter.next() {
125− match p {
126− 0 => self.sgr_reset(),
127− 1 => self.bold = format!("\x1B[{}m", parameters),
128− 2 => self.dim = format!("\x1B[{}m", parameters),
129− 3 => self.italic = format!("\x1B[{}m", parameters),
130− 4 => self.underline = format!("\x1B[{}m", parameters),
131− 23 => self.italic.clear(),
132− 24 => self.underline.clear(),
133− 22 => {
134− self.bold.clear();
135− self.dim.clear();
136− }
137− 30..=39 => self.foreground = Self::parse_color(p, &mut iter),
138− 40..=49 => self.background = Self::parse_color(p, &mut iter),
139− 58..=59 => self.underlined = Self::parse_color(p, &mut iter),
140− 90..=97 => self.foreground = Self::parse_color(p, &mut iter),
141− 100..=107 => self.foreground = Self::parse_color(p, &mut iter),
142− _ => {
143− // Unsupported SGR sequence.
144− // Be compatible and pretend one just wasn't was provided.
145− }
146− }
147− }
148−
149− true
150− }
151−
152− fn update_with_csi(&mut self, finalizer: char, sequence: &str) -> bool {
153− if finalizer == 'm' {
154− self.update_with_sgr(sequence)
155− } else {
156− false
157− }
158− }
159−
160− fn update_with_unsupported(&mut self, sequence: &str) -> bool {
161− self.unknown_buffer.push_str(sequence);
162− false
163− }
164−
165− fn update_with_charset(&mut self, kind: char, set: impl Iterator<Item = char>) -> bool {
166− self.charset = format!("\x1B{}{}", kind, set.take(1).collect::<String>());
167− true
168− }
169−
170− fn parse_color(color: u16, parameters: &mut dyn Iterator<Item = u16>) -> String {
171− match color % 10 {
172− 8 => match parameters.next() {
173− Some(5) /* 256-color */ => format!("\x1B[{};5;{}m", color, join(";", 1, parameters)),
174− Some(2) /* 24-bit color */ => format!("\x1B[{};2;{}m", color, join(";", 3, parameters)),
175− Some(c) => format!("\x1B[{};{}m", color, c),
176− _ => "".to_owned(),
177− },
178− 9 => "".to_owned(),
179− _ => format!("\x1B[{}m", color),
180− }
181− }
182−}
183−
184−impl Display for Attributes {
185− fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
186− write!(
187− f,
188− "{}{}{}{}{}{}{}{}{}",
189− self.foreground,
190− self.background,
191− self.underlined,
192− self.charset,
193− self.bold,
194− self.dim,
195− self.underline,
196− self.italic,
197− self.strike,
198− )
199− }
200−}
201−
202−fn join(
203− delimiter: &str,
204− limit: usize,
205− iterator: &mut dyn Iterator<Item = impl ToString>,
206−) -> String {
207− iterator
208− .take(limit)
209− .map(|i| i.to_string())
210− .collect::<Vec<String>>()
211− .join(delimiter)
212−}
src/wrapping.rs+2−3
@@ -1,12 +1,11 @@
1#[derive(Debug, Clone, Copy, PartialEq, Eq)]
1#[derive(Debug, Clone, Copy, PartialEq, Eq)]
2pub enum WrappingMode {
2pub enum WrappingMode {
3 Character,
3 Character,
4− // The bool specifies whether wrapping has been explicitly disabled by the user via --wrap=never
4+ NoWrapping,
5− NoWrapping(bool),
6}
5}
7
6
8impl Default for WrappingMode {
7impl Default for WrappingMode {
9 fn default() -> Self {
8 fn default() -> Self {
10− WrappingMode::NoWrapping(false)
9+ WrappingMode::NoWrapping
11 }
10 }
12}
11}
tests/.gitattributes+6−6
@@ -4,9 +4,9 @@ snapshots/** text=auto eol=lf
4syntax-tests/source/** text=auto eol=lf
4syntax-tests/source/** text=auto eol=lf
5syntax-tests/highlighted/** text=auto eol=lf
5syntax-tests/highlighted/** text=auto eol=lf
6
6
7−# Linguist overrides
7+examples/* linguist-vendored
8−benchmarks/** linguist-vendored
8+snapshots/* linguist-vendored
9−examples/** linguist-vendored
9+benchmarks/* linguist-vendored
10−snapshots/** linguist-vendored
10+benchmarks/test-src/* linguist-vendored
11−syntax-tests/highlighted/** linguist-vendored
11+scripts/* linguist-vendored
12−syntax-tests/source/** linguist-vendored
12+syntax-tests/* linguist-vendored
tests/assets.rs+5−8
@@ -1,21 +1,17 @@
1use bat::assets::HighlightingAssets;
1use bat::assets::HighlightingAssets;
2
2
3/// This test ensures that we are not accidentally removing themes due to submodule updates.
3/// This test ensures that we are not accidentally removing themes due to submodule updates.
4−/// It is 'ignore'd by default because it requires themes.bin to be up-to-date.
5#[test]
4#[test]
6−#[ignore]
7fn all_themes_are_present() {
5fn all_themes_are_present() {
8 let assets = HighlightingAssets::from_binary();
6 let assets = HighlightingAssets::from_binary();
9
7
10 let mut themes: Vec<_> = assets.themes().collect();
8 let mut themes: Vec<_> = assets.themes().collect();
11− themes.sort_unstable();
9+ themes.sort();
12
10
13 assert_eq!(
11 assert_eq!(
14 themes,
12 themes,
15 vec![
13 vec![
16 "1337",
14 "1337",
17− "Coldark-Cold",
18− "Coldark-Dark",
19 "DarkNeon",
15 "DarkNeon",
20 "Dracula",
16 "Dracula",
21 "GitHub",
17 "GitHub",
@@ -30,12 +26,13 @@ fn all_themes_are_present() {
30 "Solarized (light)",
26 "Solarized (light)",
31 "Sublime Snazzy",
27 "Sublime Snazzy",
32 "TwoDark",
28 "TwoDark",
33− "Visual Studio Dark+",
29+ "ansi-dark",
34− "ansi",
30+ "ansi-light",
35 "base16",
31 "base16",
36 "base16-256",
32 "base16-256",
37− "gruvbox-dark",
33+ "gruvbox",
38 "gruvbox-light",
34 "gruvbox-light",
35+ "gruvbox-white",
39 "zenburn"
36 "zenburn"
40 ]
37 ]
41 );
38 );
tests/benchmarks/.gitignoredeleted−1
@@ -1 +0,0 @@
1−/benchmark-results
tests/benchmarks/comparison.shnew file+33
@@ -0,0 +1,33 @@
1+#!/usr/bin/env bash
2+
3+cd "$(dirname "${BASH_SOURCE[0]}")"
4+
5+if ! which hyperfine > /dev/null 2>&1; then
6+ echo "'hyperfine' does not seem to be installed."
7+ echo "You can get it here: https://github.com/sharkdp/hyperfine"
8+ exit 1
9+fi
10+
11+SRC="test-src/jquery-3.3.1.js"
12+
13+
14+cmd_bat="bat --style=full --color=always --paging=never '$SRC'"
15+cmd_bat_simple="bat --plain --wrap=never --tabs=0 --color=always --paging=never '$SRC'"
16+cmd_pygmentize="pygmentize -g '$SRC'"
17+cmd_highlight="highlight -O truecolor '$SRC'"
18+cmd_ccat="ccat --color=always '$SRC'"
19+cmd_source_highlight="source-highlight --failsafe --infer-lang -f esc -i '$SRC'"
20+cmd_hicat="hicat '$SRC'"
21+cmd_coderay="coderay '$SRC'"
22+cmd_rouge="rougify '$SRC'"
23+
24+hyperfine --warmup 3 \
25+ "$cmd_bat" \
26+ "$cmd_bat_simple" \
27+ "$cmd_pygmentize" \
28+ "$cmd_highlight" \
29+ "$cmd_ccat" \
30+ "$cmd_source_highlight" \
31+ "$cmd_hicat" \
32+ "$cmd_coderay" \
33+ "$cmd_rouge" \
tests/benchmarks/highlighting-speed-src/grep-output-ansi-sequences.txtdeleted−2272

This diff is too big to show here.

tests/benchmarks/highlighting-speed-src/numpy_test_multiarray.pydeleted−8471

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-0.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-1.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-10.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-100.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-11.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-12.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-13.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-14.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-15.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-16.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-17.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-18.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-19.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-2.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-20.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-21.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-22.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-23.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-24.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-25.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-26.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-27.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-28.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-29.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-3.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-30.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-31.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-32.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-33.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-34.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-35.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-36.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-37.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-38.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-39.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-4.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-40.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-41.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-42.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-43.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-44.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-45.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-46.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-47.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-48.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-49.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-5.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-50.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-51.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-52.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-53.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-54.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-55.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-56.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-57.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-58.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-59.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-6.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-60.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-61.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-62.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-63.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-64.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-65.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-66.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-67.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-68.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-69.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-7.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-70.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-71.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-72.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-73.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-74.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-75.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-76.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-77.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-78.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-79.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-8.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-80.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-81.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-82.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-83.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-84.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-85.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-86.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-87.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-88.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-89.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-9.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-90.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-91.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-92.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-93.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-94.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-95.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-96.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-97.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-98.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/many-small-files/small-file-99.txtdeleted−1

This diff is too big to show here.

tests/benchmarks/run-benchmarks.sh+17−137

This diff is too big to show here.

tests/benchmarks/startup-time-src/small-CpuInfo-file.cpuinfodeleted−1

This diff is too big to show here.

tests/benchmarks/startup-time-src/small-Markdown-file.mddeleted−3

This diff is too big to show here.

tests/benchmarks/highlighting-speed-src/jquery.js → tests/benchmarks/test-src/jquery-3.3.1.jsrenamed

The content is the same.

tests/benchmarks/test-src/jquery-3.3.1.min.jsnew file+2

This diff is too big to show here.

tests/benchmarks/highlighting-speed-src/miniz.c → tests/benchmarks/test-src/miniz.crenamed

The content is the same.

tests/examples/git/.config/git/configdeleted−3

This diff is too big to show here.

tests/examples/git/.gitconfigdeleted−3

This diff is too big to show here.

tests/examples/longline.jsondeleted−3

This diff is too big to show here.

tests/examples/regression_tests/first_line_fallback.invalid-syntaxdeleted−2

This diff is too big to show here.

tests/examples/test.json.suffixdeleted−1

This diff is too big to show here.

tests/examples/test.json~deleted−1

This diff is too big to show here.

tests/integration_tests.rs+12−822

This diff is too big to show here.

tests/mocked-pagers/moredeleted−2

This diff is too big to show here.

tests/mocked-pagers/more.batdeleted−1

This diff is too big to show here.

tests/mocked-pagers/mostdeleted−2

This diff is too big to show here.

tests/mocked-pagers/most.batdeleted−1

This diff is too big to show here.

tests/no_duplicate_extensions.rs+1−4

This diff is too big to show here.

tests/scripts/find-slow-to-highlight-files.py+2−2

This diff is too big to show here.

tests/scripts/license-checks.shdeleted−24

This diff is too big to show here.

tests/snapshot_tests.rs+1−11

This diff is too big to show here.

tests/snapshots/generate_snapshots.py+1−1

This diff is too big to show here.

tests/snapshots/output/changes.snapshot.txt−1

This diff is too big to show here.

tests/snapshots/output/changes_grid.snapshot.txt−1

This diff is too big to show here.

tests/snapshots/output/changes_grid_header.snapshot.txt−1

This diff is too big to show here.

tests/snapshots/output/changes_grid_header_numbers.snapshot.txt+22−23

This diff is too big to show here.

tests/snapshots/output/changes_grid_header_numbers_rule.snapshot.txtdeleted−27

This diff is too big to show here.

tests/snapshots/output/changes_grid_header_rule.snapshot.txtdeleted−27

This diff is too big to show here.

tests/snapshots/output/changes_grid_numbers.snapshot.txt+22−23

This diff is too big to show here.

tests/snapshots/output/changes_grid_numbers_rule.snapshot.txtdeleted−25

This diff is too big to show here.

tests/snapshots/output/changes_grid_rule.snapshot.txtdeleted−25

This diff is too big to show here.

tests/snapshots/output/changes_header.snapshot.txt−1

This diff is too big to show here.

tests/snapshots/output/changes_header_numbers.snapshot.txt+22−23

This diff is too big to show here.

tests/snapshots/output/changes_header_numbers_rule.snapshot.txtdeleted−24

This diff is too big to show here.

tests/snapshots/output/changes_header_rule.snapshot.txtdeleted−24

This diff is too big to show here.

tests/snapshots/output/changes_numbers.snapshot.txt+22−23

This diff is too big to show here.

tests/snapshots/output/changes_numbers_rule.snapshot.txtdeleted−23

This diff is too big to show here.

tests/snapshots/output/changes_rule.snapshot.txtdeleted−23

This diff is too big to show here.

tests/snapshots/output/full.snapshot.txt+22−24

This diff is too big to show here.

tests/snapshots/output/grid.snapshot.txt−1

This diff is too big to show here.

tests/snapshots/output/grid_header.snapshot.txt−1

This diff is too big to show here.

tests/snapshots/output/grid_header_numbers.snapshot.txt+22−23

This diff is too big to show here.

tests/snapshots/output/grid_header_numbers_rule.snapshot.txtdeleted−27

This diff is too big to show here.

tests/snapshots/output/grid_header_rule.snapshot.txtdeleted−27

This diff is too big to show here.

tests/snapshots/output/grid_numbers.snapshot.txt+22−23

This diff is too big to show here.

tests/snapshots/output/grid_numbers_rule.snapshot.txtdeleted−25

This diff is too big to show here.

tests/snapshots/output/grid_rule.snapshot.txtdeleted−25

This diff is too big to show here.

tests/snapshots/output/header.snapshot.txt−1

This diff is too big to show here.

tests/snapshots/output/header_numbers.snapshot.txt+22−23

This diff is too big to show here.

tests/snapshots/output/header_numbers_rule.snapshot.txtdeleted−24

This diff is too big to show here.

tests/snapshots/output/header_rule.snapshot.txtdeleted−24

This diff is too big to show here.

tests/snapshots/output/numbers.snapshot.txt+22−23

This diff is too big to show here.

tests/snapshots/output/numbers_rule.snapshot.txtdeleted−23

This diff is too big to show here.

tests/snapshots/output/plain.snapshot.txt−1

This diff is too big to show here.

tests/snapshots/output/rule.snapshot.txtdeleted−23

This diff is too big to show here.

tests/snapshots/sample.modified.rs−1

This diff is too big to show here.

tests/syntax-tests/BatTestCustomAssets.sublime-syntaxdeleted−21

This diff is too big to show here.

tests/syntax-tests/create_highlighted_versions.py+55−75

This diff is too big to show here.

tests/syntax-tests/highlighted/ASP/test.aspdeleted−36

This diff is too big to show here.

tests/syntax-tests/highlighted/AppleScript/test.applescriptdeleted−25

This diff is too big to show here.

tests/syntax-tests/highlighted/BatTestCustomAssets/NoColorsUnlessCustomAssetsAreUsed.battestcustomassetsdeleted−2

This diff is too big to show here.

tests/syntax-tests/highlighted/CSV/comma_in_quotes.csv+7−7

This diff is too big to show here.

tests/syntax-tests/highlighted/Cabal/semantic.cabaldeleted−247

This diff is too big to show here.

tests/syntax-tests/highlighted/CoffeeScript/coffeescript.coffeedeleted−391

This diff is too big to show here.

tests/syntax-tests/highlighted/CpuInfo/test.CpuInfonew file+45

This diff is too big to show here.

tests/syntax-tests/highlighted/CpuInfo/test.cpuinfodeleted−45

This diff is too big to show here.

tests/syntax-tests/highlighted/D/test.ddeleted−44

This diff is too big to show here.

tests/syntax-tests/highlighted/Dart/inner_comment.dartdeleted−5

This diff is too big to show here.

tests/syntax-tests/highlighted/Dart/test.dart+52−52

This diff is too big to show here.

tests/syntax-tests/highlighted/DotENV/.envdeleted−57

This diff is too big to show here.

tests/syntax-tests/highlighted/EtcGroup/test.groupdeleted−67

This diff is too big to show here.

tests/syntax-tests/highlighted/F#/string.fsdeleted−182

This diff is too big to show here.

tests/syntax-tests/highlighted/Fish/test.fishdeleted−77

This diff is too big to show here.

tests/syntax-tests/highlighted/Fortran (Fixed Form)/quicksort_real_F77.Fdeleted−323

This diff is too big to show here.

tests/syntax-tests/highlighted/Fortran (Modern)/test_savetxt.f90deleted−119

This diff is too big to show here.

tests/syntax-tests/highlighted/Fortran Namelist/test.namelistdeleted−5

This diff is too big to show here.

tests/syntax-tests/highlighted/Git Attributes/example.gitattributesdeleted−16

This diff is too big to show here.

tests/syntax-tests/highlighted/Git Config/text.gitconfigdeleted−107

This diff is too big to show here.

tests/syntax-tests/highlighted/Graphviz DOT/test_digraph.dotdeleted−41

This diff is too big to show here.

tests/syntax-tests/highlighted/Graphviz DOT/test_graph.dotdeleted−3

This diff is too big to show here.

tests/syntax-tests/highlighted/Groff/rustdoc.1deleted−126

This diff is too big to show here.

tests/syntax-tests/highlighted/INI/test.infdeleted−5

This diff is too big to show here.

tests/syntax-tests/highlighted/Ignored suffixes/test.rs.bakdeleted−1

This diff is too big to show here.

tests/syntax-tests/highlighted/Ignored suffixes/test.rs.dpkg-distdeleted−1

This diff is too big to show here.

tests/syntax-tests/highlighted/Ignored suffixes/test.rs.dpkg-olddeleted−1

This diff is too big to show here.

tests/syntax-tests/highlighted/Ignored suffixes/test.rs.indeleted−1

This diff is too big to show here.

tests/syntax-tests/highlighted/Ignored suffixes/test.rs.in.indeleted−1

This diff is too big to show here.

tests/syntax-tests/highlighted/Ignored suffixes/test.rs.olddeleted−1

This diff is too big to show here.

tests/syntax-tests/highlighted/Ignored suffixes/test.rs.origdeleted−1

This diff is too big to show here.

tests/syntax-tests/highlighted/Ignored suffixes/test.rs.orig~deleted−1

This diff is too big to show here.

tests/syntax-tests/highlighted/Ignored suffixes/test.rs.rpmnewdeleted−1

This diff is too big to show here.

tests/syntax-tests/highlighted/Ignored suffixes/test.rs.rpmorigdeleted−1

This diff is too big to show here.

tests/syntax-tests/highlighted/Ignored suffixes/test.rs.rpmsavedeleted−1

This diff is too big to show here.

tests/syntax-tests/highlighted/Ignored suffixes/test.rs.ucf-distdeleted−1

This diff is too big to show here.

tests/syntax-tests/highlighted/Ignored suffixes/test.rs.ucf-newdeleted−1

This diff is too big to show here.

tests/syntax-tests/highlighted/Ignored suffixes/test.rs.ucf-olddeleted−1

This diff is too big to show here.

tests/syntax-tests/highlighted/Ignored suffixes/test.rs~deleted−1

This diff is too big to show here.

tests/syntax-tests/highlighted/Ignored suffixes/test.unknown~deleted−1

This diff is too big to show here.

tests/syntax-tests/highlighted/JQ/sample.jqdeleted−60

This diff is too big to show here.

tests/syntax-tests/highlighted/JSON/test.json+16−16

This diff is too big to show here.

tests/syntax-tests/highlighted/Java Server Page (JSP)/sessionDetail.jspdeleted−197

This diff is too big to show here.

tests/syntax-tests/highlighted/Julia/test.jl+22−22

This diff is too big to show here.

tests/syntax-tests/highlighted/LLVM/test.lldeleted−29

This diff is too big to show here.

tests/syntax-tests/highlighted/Lean/test.leandeleted−68

This diff is too big to show here.

tests/syntax-tests/highlighted/Lisp/utils.lispdeleted−80

This diff is too big to show here.

tests/syntax-tests/highlighted/Literate Haskell/Main.lhsdeleted−47

This diff is too big to show here.

tests/syntax-tests/highlighted/LiveScript/livescript-demo.lsdeleted−83

This diff is too big to show here.

tests/syntax-tests/highlighted/Log/example.logdeleted−3

This diff is too big to show here.

tests/syntax-tests/highlighted/MATLAB/test.matlabdeleted−34

This diff is too big to show here.

tests/syntax-tests/highlighted/Makefile/Makefiledeleted−385

This diff is too big to show here.

tests/syntax-tests/highlighted/Manpage/bat-0.16.mandeleted−243

This diff is too big to show here.

tests/syntax-tests/highlighted/Manpage/select-2.mandeleted−330

This diff is too big to show here.

tests/syntax-tests/highlighted/MediaWiki/test.mediawikideleted−37

This diff is too big to show here.

tests/syntax-tests/highlighted/MemInfo/test.MemInfonew file+53

This diff is too big to show here.

tests/syntax-tests/highlighted/MemInfo/test.meminfodeleted−53

This diff is too big to show here.

tests/syntax-tests/highlighted/NAnt Build File/Default.builddeleted−167

This diff is too big to show here.

tests/syntax-tests/highlighted/Ninja/test.ninjadeleted−6

This diff is too big to show here.

tests/syntax-tests/highlighted/Objective-C++/test.mmdeleted−68

This diff is too big to show here.

tests/syntax-tests/highlighted/Objective-C/test.mdeleted−32

This diff is too big to show here.

tests/syntax-tests/highlighted/Plaintext/plaintext.txt+1−1

This diff is too big to show here.

tests/syntax-tests/highlighted/PowerShell/test.ps1deleted−25

This diff is too big to show here.

tests/syntax-tests/highlighted/Puppet/manifest_large_exported_classes_node.ppdeleted−65

This diff is too big to show here.

tests/syntax-tests/highlighted/PureScript/test.pursdeleted−89

This diff is too big to show here.

tests/syntax-tests/highlighted/Python/battest.py+7−12

This diff is too big to show here.

tests/syntax-tests/highlighted/QML/BatSyntaxTest.qmldeleted−219

This diff is too big to show here.

tests/syntax-tests/highlighted/Racket/test.rktdeleted−56

This diff is too big to show here.

tests/syntax-tests/highlighted/Rego/src_test.regodeleted−181

This diff is too big to show here.

tests/syntax-tests/highlighted/Regular Expression/test.redeleted−1

This diff is too big to show here.

tests/syntax-tests/highlighted/RequirementsTXT/requirements.txtnew file+8

This diff is too big to show here.

tests/syntax-tests/highlighted/Robot Framework/recipe141_aws_simple_storage_service.robotdeleted−31

This diff is too big to show here.

tests/syntax-tests/highlighted/Ruby Haml/test.html.hamldeleted−15

This diff is too big to show here.

tests/syntax-tests/highlighted/Ruby On Rails/test.rbdeleted−22

This diff is too big to show here.

tests/syntax-tests/highlighted/SCSS/example.scss+16−16

This diff is too big to show here.

tests/syntax-tests/highlighted/SLS/test.slsdeleted−57

This diff is too big to show here.

tests/syntax-tests/highlighted/SSHD Config/sshd_configdeleted−36

This diff is too big to show here.

tests/syntax-tests/highlighted/Sass/example.sassdeleted−76

This diff is too big to show here.

tests/syntax-tests/highlighted/Slim/test.slimdeleted−20

This diff is too big to show here.

tests/syntax-tests/highlighted/Solidity/ERC721.soldeleted−376

This diff is too big to show here.

tests/syntax-tests/highlighted/Strace/ls.stracedeleted−94

This diff is too big to show here.

tests/syntax-tests/highlighted/Stylus/gradients.styldeleted−90

This diff is too big to show here.

tests/syntax-tests/highlighted/Svelte/App.sveltedeleted−65

This diff is too big to show here.

tests/syntax-tests/highlighted/Syslog/example.syslogdeleted−16

This diff is too big to show here.

tests/syntax-tests/highlighted/SystemVerilog/output.svdeleted−103

This diff is too big to show here.

tests/syntax-tests/highlighted/Tcl/test.tcldeleted−22

This diff is too big to show here.

tests/syntax-tests/highlighted/Textile/test.textiledeleted−40

This diff is too big to show here.

tests/syntax-tests/highlighted/TypeScriptReact/app.tsxdeleted−35

This diff is too big to show here.

tests/syntax-tests/highlighted/Verilog/div_pipelined.vdeleted−172

This diff is too big to show here.

tests/syntax-tests/highlighted/VimL/source.vimdeleted−92

This diff is too big to show here.

tests/syntax-tests/highlighted/Vue/example.vuedeleted−60

This diff is too big to show here.

tests/syntax-tests/highlighted/Vyper/crowdsale.vydeleted−89

This diff is too big to show here.

tests/syntax-tests/highlighted/XAML/ItemPage.xamldeleted−264

This diff is too big to show here.

tests/syntax-tests/highlighted/Zig/example.zigdeleted−107

This diff is too big to show here.

tests/syntax-tests/highlighted/cmd-help/test.cmd-helpdeleted−54

This diff is too big to show here.

tests/syntax-tests/highlighted/dash/shfmdeleted−425

This diff is too big to show here.

tests/syntax-tests/highlighted/gnuplot/test.gpdeleted−19

This diff is too big to show here.

tests/syntax-tests/highlighted/http-request-response/example.httpdeleted−44

This diff is too big to show here.

tests/syntax-tests/highlighted/jsonnet/stdlib.jsonnetdeleted−88

This diff is too big to show here.

tests/syntax-tests/highlighted/nginx/nginx.confdeleted−140

This diff is too big to show here.

tests/syntax-tests/highlighted/nim/main.nimdeleted−41

This diff is too big to show here.

tests/syntax-tests/highlighted/nim/test.nimbledeleted−23

This diff is too big to show here.

tests/syntax-tests/highlighted/nix/test.nixdeleted−15

This diff is too big to show here.

tests/syntax-tests/highlighted/orgmode/test.orgdeleted−38

This diff is too big to show here.

tests/syntax-tests/highlighted/reStructuredText/reference.rstdeleted−320

This diff is too big to show here.

tests/syntax-tests/highlighted/resolv.conf/resolv.confdeleted−4

This diff is too big to show here.

tests/syntax-tests/highlighted/varlink/org.varlink.certification.varlinkdeleted−86

This diff is too big to show here.

tests/syntax-tests/regression_test.sh+1−1

This diff is too big to show here.

tests/syntax-tests/source/ASP/test.aspdeleted−36

This diff is too big to show here.

tests/syntax-tests/source/ActionScript/test.as+1−1

This diff is too big to show here.

tests/syntax-tests/source/AppleScript/test.applescriptdeleted−25

This diff is too big to show here.

tests/syntax-tests/source/BatTestCustomAssets/NoColorsUnlessCustomAssetsAreUsed.battestcustomassetsdeleted−2

This diff is too big to show here.

tests/syntax-tests/source/Batch/build.bat+1−1

This diff is too big to show here.

tests/syntax-tests/source/Cabal/LICENSE.mddeleted−25

This diff is too big to show here.

tests/syntax-tests/source/Cabal/semantic.cabaldeleted−247

This diff is too big to show here.

tests/syntax-tests/source/Clojure/test.clj+1−1

This diff is too big to show here.

tests/syntax-tests/source/CoffeeScript/LICENSE.mddeleted−26

This diff is too big to show here.

tests/syntax-tests/source/CoffeeScript/coffeescript.coffeedeleted−391

This diff is too big to show here.

tests/syntax-tests/source/CpuInfo/test.cpuinfo → tests/syntax-tests/source/CpuInfo/test.CpuInforenamed

The content is the same.

tests/syntax-tests/source/D/test.ddeleted−44

This diff is too big to show here.

tests/syntax-tests/source/Dart/inner_comment.dartdeleted−5

This diff is too big to show here.

tests/syntax-tests/source/Dockerfile/Dockerfile+1−1

This diff is too big to show here.

tests/syntax-tests/source/DotENV/.envdeleted−57

This diff is too big to show here.

tests/syntax-tests/source/DotENV/LICENSE.mddeleted−23

This diff is too big to show here.

tests/syntax-tests/source/EtcGroup/test.groupdeleted−67

This diff is too big to show here.

tests/syntax-tests/source/F#/LICENSE.mddeleted−27

This diff is too big to show here.

tests/syntax-tests/source/F#/string.fsdeleted−182

This diff is too big to show here.

tests/syntax-tests/source/Fish/test.fishdeleted−77

This diff is too big to show here.

tests/syntax-tests/source/Fortran (Fixed Form)/LICENSE.mddeleted−25

This diff is too big to show here.

tests/syntax-tests/source/Fortran (Fixed Form)/quicksort_real_F77.Fdeleted−323

This diff is too big to show here.

tests/syntax-tests/source/Fortran (Modern)/LICENSE.mddeleted−25

This diff is too big to show here.

tests/syntax-tests/source/Fortran (Modern)/test_savetxt.f90deleted−119

This diff is too big to show here.

tests/syntax-tests/source/Fortran Namelist/test.namelistdeleted−5

This diff is too big to show here.

tests/syntax-tests/source/Git Attributes/example.gitattributesdeleted−16

This diff is too big to show here.

tests/syntax-tests/source/Git Config/LICENSE.mddeleted−1

This diff is too big to show here.

tests/syntax-tests/source/Git Config/text.gitconfigdeleted−107

This diff is too big to show here.

tests/syntax-tests/source/Graphviz DOT/LICENSE.mddeleted−22

This diff is too big to show here.

tests/syntax-tests/source/Graphviz DOT/test_digraph.dotdeleted−41

This diff is too big to show here.

tests/syntax-tests/source/Graphviz DOT/test_graph.dotdeleted−3

This diff is too big to show here.

tests/syntax-tests/source/Groff/LICENSE.mddeleted−235

This diff is too big to show here.

tests/syntax-tests/source/Groff/rustdoc.1deleted−126

This diff is too big to show here.

tests/syntax-tests/source/Hosts/hosts+1−1

This diff is too big to show here.

tests/syntax-tests/source/INI/test.infdeleted−5

This diff is too big to show here.

tests/syntax-tests/source/Ignored suffixes/test.rs.bakdeleted−1

This diff is too big to show here.

tests/syntax-tests/source/Ignored suffixes/test.rs.dpkg-distdeleted−1

This diff is too big to show here.

tests/syntax-tests/source/Ignored suffixes/test.rs.dpkg-olddeleted−1

This diff is too big to show here.

tests/syntax-tests/source/Ignored suffixes/test.rs.indeleted−1

This diff is too big to show here.

tests/syntax-tests/source/Ignored suffixes/test.rs.in.indeleted−1

This diff is too big to show here.

tests/syntax-tests/source/Ignored suffixes/test.rs.olddeleted−1

This diff is too big to show here.

tests/syntax-tests/source/Ignored suffixes/test.rs.origdeleted−1

This diff is too big to show here.

tests/syntax-tests/source/Ignored suffixes/test.rs.orig~deleted−1

This diff is too big to show here.

tests/syntax-tests/source/Ignored suffixes/test.rs.rpmnewdeleted−1

This diff is too big to show here.

tests/syntax-tests/source/Ignored suffixes/test.rs.rpmorigdeleted−1

This diff is too big to show here.

tests/syntax-tests/source/Ignored suffixes/test.rs.rpmsavedeleted−1

This diff is too big to show here.

tests/syntax-tests/source/Ignored suffixes/test.rs.ucf-distdeleted−1

This diff is too big to show here.

tests/syntax-tests/source/Ignored suffixes/test.rs.ucf-newdeleted−1

This diff is too big to show here.

tests/syntax-tests/source/Ignored suffixes/test.rs.ucf-olddeleted−1

This diff is too big to show here.

tests/syntax-tests/source/Ignored suffixes/test.rs~deleted−1

This diff is too big to show here.

tests/syntax-tests/source/Ignored suffixes/test.unknown~deleted−1

This diff is too big to show here.

tests/syntax-tests/source/JQ/LICENSE.mddeleted−25

This diff is too big to show here.

tests/syntax-tests/source/JQ/sample.jqdeleted−60

This diff is too big to show here.

tests/syntax-tests/source/Java Server Page (JSP)/LICENSE.mddeleted−1141

This diff is too big to show here.

tests/syntax-tests/source/Java Server Page (JSP)/NOTICEdeleted−68

This diff is too big to show here.

tests/syntax-tests/source/Java Server Page (JSP)/sessionDetail.jspdeleted−197

This diff is too big to show here.

tests/syntax-tests/source/LLVM/test.lldeleted−29

This diff is too big to show here.

tests/syntax-tests/source/Lean/test.leandeleted−68

This diff is too big to show here.

tests/syntax-tests/source/Lisp/LICENSE.mddeleted−24

This diff is too big to show here.

tests/syntax-tests/source/Lisp/utils.lispdeleted−80

This diff is too big to show here.

tests/syntax-tests/source/Literate Haskell/Main.lhsdeleted−47

This diff is too big to show here.

tests/syntax-tests/source/LiveScript/LICENSE.mddeleted−23

This diff is too big to show here.

tests/syntax-tests/source/LiveScript/livescript-demo.lsdeleted−83

This diff is too big to show here.

tests/syntax-tests/source/Log/example.logdeleted−3

This diff is too big to show here.

tests/syntax-tests/source/MATLAB/LICENSE.mddeleted−27

This diff is too big to show here.

tests/syntax-tests/source/MATLAB/test.matlabdeleted−34

This diff is too big to show here.

tests/syntax-tests/source/Makefile/LICENSE.mddeleted−12

This diff is too big to show here.

tests/syntax-tests/source/Makefile/Makefiledeleted−385

This diff is too big to show here.

tests/syntax-tests/source/Manpage/bat-0.16.mandeleted−243

This diff is too big to show here.

tests/syntax-tests/source/Manpage/select-2.mandeleted−330

This diff is too big to show here.

tests/syntax-tests/source/MediaWiki/test.mediawikideleted−37

This diff is too big to show here.

tests/syntax-tests/source/MemInfo/test.meminfo → tests/syntax-tests/source/MemInfo/test.MemInforenamed

The content is the same.

tests/syntax-tests/source/NAnt Build File/Default.builddeleted−167

This diff is too big to show here.

tests/syntax-tests/source/NAnt Build File/LICENSE.mddeleted−25

This diff is too big to show here.

tests/syntax-tests/source/Ninja/LICENSE.mddeleted−204

This diff is too big to show here.

tests/syntax-tests/source/Ninja/test.ninjadeleted−6

This diff is too big to show here.

tests/syntax-tests/source/Objective-C++/test.mmdeleted−68

This diff is too big to show here.

tests/syntax-tests/source/Objective-C/test.mdeleted−32

This diff is too big to show here.

tests/syntax-tests/source/PHP/test.php+1−1

This diff is too big to show here.

tests/syntax-tests/source/Plaintext/plaintext.txt

Binary file not shown.

tests/syntax-tests/source/PowerShell/test.ps1deleted

Binary file not shown.

tests/syntax-tests/source/Puppet/LICENSE.mddeleted−206

This diff is too big to show here.

tests/syntax-tests/source/Puppet/manifest_large_exported_classes_node.ppdeleted−65

This diff is too big to show here.

tests/syntax-tests/source/PureScript/test.pursdeleted−89

This diff is too big to show here.

tests/syntax-tests/source/Python/battest.py+7−12

This diff is too big to show here.

tests/syntax-tests/source/QML/BatSyntaxTest.qmldeleted−219

This diff is too big to show here.

tests/syntax-tests/source/Racket/test.rktdeleted−56

This diff is too big to show here.

tests/syntax-tests/source/Rego/LICENSE.mddeleted−25

This diff is too big to show here.

tests/syntax-tests/source/Rego/src_test.regodeleted−181

This diff is too big to show here.

tests/syntax-tests/source/Regular Expression/test.redeleted−1

This diff is too big to show here.

tests/syntax-tests/source/RequirementsTXT/requirements.txtnew file+8

This diff is too big to show here.

tests/syntax-tests/source/Robot Framework/LICENSE.mddeleted−25

This diff is too big to show here.

tests/syntax-tests/source/Robot Framework/recipe141_aws_simple_storage_service.robotdeleted−31

This diff is too big to show here.

tests/syntax-tests/source/Ruby Haml/test.html.hamldeleted−15

This diff is too big to show here.

tests/syntax-tests/source/Ruby On Rails/test.rbdeleted−22

This diff is too big to show here.

tests/syntax-tests/source/SLS/test.slsdeleted−57

This diff is too big to show here.

tests/syntax-tests/source/SSHD Config/sshd_configdeleted−36

This diff is too big to show here.

tests/syntax-tests/source/Sass/example.sassdeleted−76

This diff is too big to show here.

tests/syntax-tests/source/Slim/test.slimdeleted−20

This diff is too big to show here.

tests/syntax-tests/source/Solidity/ERC721.soldeleted−376

This diff is too big to show here.

tests/syntax-tests/source/Solidity/LICENSE.mddeleted−27

This diff is too big to show here.

tests/syntax-tests/source/Strace/ls.stracedeleted−94

This diff is too big to show here.

tests/syntax-tests/source/Stylus/LICENSE.mddeleted−24

This diff is too big to show here.

tests/syntax-tests/source/Stylus/gradients.styldeleted−90

This diff is too big to show here.

tests/syntax-tests/source/Svelte/App.sveltedeleted−65

This diff is too big to show here.

tests/syntax-tests/source/Svelte/LICENSE.mddeleted−14

This diff is too big to show here.

tests/syntax-tests/source/Syslog/example.syslogdeleted−16

This diff is too big to show here.

tests/syntax-tests/source/SystemVerilog/output.svdeleted−103

This diff is too big to show here.

tests/syntax-tests/source/Tcl/test.tcldeleted−22

This diff is too big to show here.

tests/syntax-tests/source/Textile/test.textiledeleted−40

This diff is too big to show here.

tests/syntax-tests/source/TypeScriptReact/LICENSE.mddeleted−25

This diff is too big to show here.

tests/syntax-tests/source/TypeScriptReact/app.tsxdeleted−35

This diff is too big to show here.

tests/syntax-tests/source/Verilog/LICENSE.mddeleted−205

This diff is too big to show here.

tests/syntax-tests/source/Verilog/div_pipelined.vdeleted−172

This diff is too big to show here.

tests/syntax-tests/source/VimL/source.vimdeleted−92

This diff is too big to show here.

tests/syntax-tests/source/Vue/example.vuedeleted−60

This diff is too big to show here.

tests/syntax-tests/source/Vyper/LICENSE.mddeleted−205

This diff is too big to show here.

tests/syntax-tests/source/Vyper/crowdsale.vydeleted−89

This diff is too big to show here.

tests/syntax-tests/source/XAML/ItemPage.xamldeleted−264

This diff is too big to show here.

tests/syntax-tests/source/XAML/LICENSE.mddeleted−23

This diff is too big to show here.

tests/syntax-tests/source/YAML/example.yaml+1−1

This diff is too big to show here.

tests/syntax-tests/source/Zig/example.zigdeleted−107

This diff is too big to show here.

tests/syntax-tests/source/cmd-help/test.cmd-helpdeleted−54

This diff is too big to show here.

tests/syntax-tests/source/dash/LICENSE.mddeleted−23

This diff is too big to show here.

tests/syntax-tests/source/dash/shfmdeleted−425

This diff is too big to show here.

tests/syntax-tests/source/gnuplot/test.gpdeleted−19

This diff is too big to show here.

tests/syntax-tests/source/http-request-response/example.httpdeleted−44

This diff is too big to show here.

tests/syntax-tests/source/jsonnet/LICENSE.mddeleted−206

This diff is too big to show here.

tests/syntax-tests/source/jsonnet/stdlib.jsonnetdeleted−88

This diff is too big to show here.

tests/syntax-tests/source/nginx/nginx.confdeleted−140

This diff is too big to show here.

tests/syntax-tests/source/nim/main.nimdeleted−41

This diff is too big to show here.

tests/syntax-tests/source/nim/test.nimbledeleted−23

This diff is too big to show here.

tests/syntax-tests/source/nix/test.nixdeleted−15

This diff is too big to show here.

tests/syntax-tests/source/orgmode/test.orgdeleted−38

This diff is too big to show here.

tests/syntax-tests/source/reStructuredText/reference.rstdeleted−320

This diff is too big to show here.

tests/syntax-tests/source/resolv.conf/resolv.confdeleted−4

This diff is too big to show here.

tests/syntax-tests/source/varlink/LICENSE.mddeleted−229

This diff is too big to show here.

tests/syntax-tests/source/varlink/org.varlink.certification.varlinkdeleted−86

This diff is too big to show here.

tests/syntax-tests/test_custom_assets.shdeleted−74

This diff is too big to show here.

tests/syntax-tests/update.sh+1−1

This diff is too big to show here.

tests/tester.rs+19−21

This diff is too big to show here.

tests/utils/mocked_pagers.rsdeleted−69

This diff is too big to show here.

tests/utils/mod.rsdeleted−1

This diff is too big to show here.