mirror of
https://github.com/sharkdp/bat.git
synced 2025-09-01 10:52:24 +01:00
Compare commits
4 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
6a6041c72c | ||
|
0d93abde67 | ||
|
1cc39a790f | ||
|
2d93da1869 |
21
.github/ISSUE_TEMPLATE/bug_report.md
vendored
21
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -7,26 +7,9 @@ assignees: ''
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
<!--
|
<!-- Hey there, thank you for creating an issue! -->
|
||||||
|
|
||||||
Hey there, thank you for reporting a bug!
|
**Describe the bug you encountered:**
|
||||||
|
|
||||||
Please note that the following bugs have already been reported:
|
|
||||||
|
|
||||||
* dpkg: error processing archive /some/path/some-program.deb (--unpack):
|
|
||||||
trying to overwrite '/usr/.crates2.json'
|
|
||||||
|
|
||||||
See https://github.com/sharkdp/bat/issues/938
|
|
||||||
|
|
||||||
-->
|
|
||||||
|
|
||||||
**What steps will reproduce the bug?**
|
|
||||||
|
|
||||||
1. step 1
|
|
||||||
2. step 2
|
|
||||||
3. ...
|
|
||||||
|
|
||||||
**What happens?**
|
|
||||||
|
|
||||||
...
|
...
|
||||||
|
|
||||||
|
2
.github/ISSUE_TEMPLATE/question.md
vendored
2
.github/ISSUE_TEMPLATE/question.md
vendored
@@ -7,5 +7,3 @@ assignees: ''
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
<!-- Using a normal ticket is still fine, but feel free to ask your
|
|
||||||
questions about bat on https://github.com/sharkdp/bat/discussions instead. -->
|
|
||||||
|
6
.github/dependabot.yml
vendored
6
.github/dependabot.yml
vendored
@@ -16,9 +16,3 @@ updates:
|
|||||||
interval: monthly
|
interval: monthly
|
||||||
time: "04:00"
|
time: "04:00"
|
||||||
timezone: Europe/Berlin
|
timezone: Europe/Berlin
|
||||||
- package-ecosystem: "github-actions"
|
|
||||||
directory: "/"
|
|
||||||
schedule:
|
|
||||||
interval: monthly
|
|
||||||
time: "04:00"
|
|
||||||
timezone: Europe/Berlin
|
|
||||||
|
231
.github/workflows/CICD.yml
vendored
231
.github/workflows/CICD.yml
vendored
@@ -1,6 +1,7 @@
|
|||||||
name: CICD
|
name: CICD
|
||||||
|
|
||||||
env:
|
env:
|
||||||
|
MIN_SUPPORTED_RUST_VERSION: "1.51.0"
|
||||||
CICD_INTERMEDIATES_DIR: "_cicd-intermediates"
|
CICD_INTERMEDIATES_DIR: "_cicd-intermediates"
|
||||||
|
|
||||||
on:
|
on:
|
||||||
@@ -17,17 +18,20 @@ jobs:
|
|||||||
name: Ensure 'cargo fmt' has been run
|
name: Ensure 'cargo fmt' has been run
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
steps:
|
steps:
|
||||||
- uses: dtolnay/rust-toolchain@stable
|
- uses: actions-rs/toolchain@v1
|
||||||
with:
|
with:
|
||||||
|
toolchain: stable
|
||||||
|
default: true
|
||||||
|
profile: minimal
|
||||||
components: rustfmt
|
components: rustfmt
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v2
|
||||||
- run: cargo fmt -- --check
|
- run: cargo fmt -- --check
|
||||||
|
|
||||||
license_checks:
|
license_checks:
|
||||||
name: License checks
|
name: License checks
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v2
|
||||||
with:
|
with:
|
||||||
submodules: true # we especially want to perform license checks on submodules
|
submodules: true # we especially want to perform license checks on submodules
|
||||||
- run: tests/scripts/license-checks.sh
|
- run: tests/scripts/license-checks.sh
|
||||||
@@ -35,45 +39,64 @@ jobs:
|
|||||||
min_version:
|
min_version:
|
||||||
name: Minimum supported rust version
|
name: Minimum supported rust version
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
env:
|
|
||||||
MSRV_FEATURES: --no-default-features --features minimal-application,bugreport,build-assets
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout source code
|
- name: Checkout source code
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v2
|
||||||
|
|
||||||
- name: Get the MSRV from the package metadata
|
- name: Install rust toolchain (v${{ env.MIN_SUPPORTED_RUST_VERSION }})
|
||||||
id: msrv
|
uses: actions-rs/toolchain@v1
|
||||||
run: cargo metadata --no-deps --format-version 1 | jq -r '"version=" + (.packages[] | select(.name == "bat")).rust_version' >> $GITHUB_OUTPUT
|
|
||||||
- name: Install rust toolchain (v${{ steps.msrv.outputs.version }})
|
|
||||||
uses: dtolnay/rust-toolchain@master
|
|
||||||
with:
|
with:
|
||||||
toolchain: ${{ steps.msrv.outputs.version }}
|
toolchain: ${{ env.MIN_SUPPORTED_RUST_VERSION }}
|
||||||
|
default: true
|
||||||
|
profile: minimal # minimal component installation (ie, no documentation)
|
||||||
components: clippy
|
components: clippy
|
||||||
- name: Run clippy (on minimum supported rust version to prevent warnings we can't fix)
|
- name: Run clippy (on minimum supported rust version to prevent warnings we can't fix)
|
||||||
run: cargo clippy --locked --all-targets ${{ env.MSRV_FEATURES }}
|
uses: actions-rs/cargo@v1
|
||||||
|
with:
|
||||||
|
command: clippy
|
||||||
|
args: --locked --all-targets --all-features
|
||||||
- name: Run tests
|
- name: Run tests
|
||||||
run: cargo test --locked ${{ env.MSRV_FEATURES }}
|
uses: actions-rs/cargo@v1
|
||||||
|
with:
|
||||||
|
command: test
|
||||||
|
args: --locked
|
||||||
|
|
||||||
test_with_new_syntaxes_and_themes:
|
test_with_new_syntaxes_and_themes:
|
||||||
name: Run tests with updated syntaxes and themes
|
name: Run tests with updated syntaxes and themes
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
steps:
|
steps:
|
||||||
- name: Git checkout
|
- name: Git checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v2
|
||||||
with:
|
with:
|
||||||
submodules: true # we need all syntax and theme submodules
|
submodules: true # we need all syntax and theme submodules
|
||||||
- name: Install Rust toolchain
|
- name: Install Rust toolchain
|
||||||
uses: dtolnay/rust-toolchain@stable
|
uses: actions-rs/toolchain@v1
|
||||||
|
with:
|
||||||
|
toolchain: stable
|
||||||
|
default: true
|
||||||
|
profile: minimal
|
||||||
- name: Build and install bat
|
- name: Build and install bat
|
||||||
run: cargo install --locked --path .
|
uses: actions-rs/cargo@v1
|
||||||
|
with:
|
||||||
|
command: install
|
||||||
|
args: --locked --path .
|
||||||
- name: Rebuild binary assets (syntaxes and themes)
|
- name: Rebuild binary assets (syntaxes and themes)
|
||||||
run: bash assets/create.sh
|
run: bash assets/create.sh
|
||||||
- name: Build and install bat with updated assets
|
- name: Build and install bat with updated assets
|
||||||
run: cargo install --locked --path .
|
uses: actions-rs/cargo@v1
|
||||||
|
with:
|
||||||
|
command: install
|
||||||
|
args: --locked --path .
|
||||||
- name: Run unit tests with new syntaxes and themes
|
- name: Run unit tests with new syntaxes and themes
|
||||||
run: cargo test --locked --release
|
uses: actions-rs/cargo@v1
|
||||||
|
with:
|
||||||
|
command: test
|
||||||
|
args: --locked --release
|
||||||
- name: Run ignored-by-default unit tests with new syntaxes and themes
|
- name: Run ignored-by-default unit tests with new syntaxes and themes
|
||||||
run: cargo test --locked --release --test assets -- --ignored
|
uses: actions-rs/cargo@v1
|
||||||
|
with:
|
||||||
|
command: test
|
||||||
|
args: --locked --release -- --ignored
|
||||||
- name: Syntax highlighting regression test
|
- name: Syntax highlighting regression test
|
||||||
run: tests/syntax-tests/regression_test.sh
|
run: tests/syntax-tests/regression_test.sh
|
||||||
- name: List of languages
|
- name: List of languages
|
||||||
@@ -83,36 +106,25 @@ jobs:
|
|||||||
- name: Test custom assets
|
- name: Test custom assets
|
||||||
run: tests/syntax-tests/test_custom_assets.sh
|
run: tests/syntax-tests/test_custom_assets.sh
|
||||||
|
|
||||||
test_with_system_config:
|
|
||||||
name: Run tests with system wide configuration
|
|
||||||
runs-on: ubuntu-20.04
|
|
||||||
steps:
|
|
||||||
- name: Git checkout
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
- name: Prepare environment variables
|
|
||||||
run: |
|
|
||||||
echo "BAT_SYSTEM_CONFIG_PREFIX=$GITHUB_WORKSPACE/tests/examples/system_config" >> $GITHUB_ENV
|
|
||||||
- name: Install Rust toolchain
|
|
||||||
uses: dtolnay/rust-toolchain@stable
|
|
||||||
- name: Build and install bat
|
|
||||||
run: cargo install --locked --path .
|
|
||||||
- name: Run unit tests
|
|
||||||
run: cargo test --locked --test system_wide_config -- --ignored
|
|
||||||
|
|
||||||
documentation:
|
documentation:
|
||||||
name: Documentation
|
name: Documentation
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
steps:
|
steps:
|
||||||
- name: Git checkout
|
- name: Git checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v2
|
||||||
- name: Install Rust toolchain
|
- name: Install Rust toolchain
|
||||||
uses: dtolnay/rust-toolchain@stable
|
uses: actions-rs/toolchain@v1
|
||||||
|
with:
|
||||||
|
toolchain: stable
|
||||||
|
default: true
|
||||||
|
profile: minimal
|
||||||
- name: Check documentation
|
- name: Check documentation
|
||||||
env:
|
env:
|
||||||
RUSTDOCFLAGS: -D warnings
|
RUSTDOCFLAGS: -D warnings
|
||||||
run: cargo doc --locked --no-deps --document-private-items --all-features
|
uses: actions-rs/cargo@v1
|
||||||
- name: Show man page
|
with:
|
||||||
run: man $(find . -name bat.1)
|
command: doc
|
||||||
|
args: --locked --no-deps --document-private-items --all-features
|
||||||
|
|
||||||
build:
|
build:
|
||||||
name: ${{ matrix.job.target }} (${{ matrix.job.os }})
|
name: ${{ matrix.job.target }} (${{ matrix.job.os }})
|
||||||
@@ -130,13 +142,11 @@ jobs:
|
|||||||
- { target: x86_64-apple-darwin , os: macos-10.15 }
|
- { target: x86_64-apple-darwin , os: macos-10.15 }
|
||||||
- { target: x86_64-pc-windows-gnu , os: windows-2019 }
|
- { target: x86_64-pc-windows-gnu , os: windows-2019 }
|
||||||
- { target: x86_64-pc-windows-msvc , os: windows-2019 }
|
- { target: x86_64-pc-windows-msvc , os: windows-2019 }
|
||||||
- { target: x86_64-unknown-linux-gnu , os: ubuntu-20.04, use-cross: true }
|
- { target: x86_64-unknown-linux-gnu , os: ubuntu-20.04 }
|
||||||
- { target: x86_64-unknown-linux-musl , os: ubuntu-20.04, use-cross: true }
|
- { target: x86_64-unknown-linux-musl , os: ubuntu-20.04, use-cross: true }
|
||||||
env:
|
|
||||||
BUILD_CMD: cargo
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout source code
|
- name: Checkout source code
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v2
|
||||||
|
|
||||||
- name: Install prerequisites
|
- name: Install prerequisites
|
||||||
shell: bash
|
shell: bash
|
||||||
@@ -155,20 +165,12 @@ jobs:
|
|||||||
echo "PROJECT_HOMEPAGE=$(sed -n 's/^homepage = "\(.*\)"/\1/p' Cargo.toml)" >> $GITHUB_ENV
|
echo "PROJECT_HOMEPAGE=$(sed -n 's/^homepage = "\(.*\)"/\1/p' Cargo.toml)" >> $GITHUB_ENV
|
||||||
|
|
||||||
- name: Install Rust toolchain
|
- name: Install Rust toolchain
|
||||||
uses: dtolnay/rust-toolchain@stable
|
uses: actions-rs/toolchain@v1
|
||||||
with:
|
with:
|
||||||
targets: ${{ matrix.job.target }}
|
toolchain: stable
|
||||||
|
target: ${{ matrix.job.target }}
|
||||||
- name: Install cross
|
override: true
|
||||||
if: matrix.job.use-cross
|
profile: minimal # minimal component installation (ie, no documentation)
|
||||||
uses: taiki-e/install-action@v2
|
|
||||||
with:
|
|
||||||
tool: cross
|
|
||||||
|
|
||||||
- name: Overwrite build command env variable
|
|
||||||
if: matrix.job.use-cross
|
|
||||||
shell: bash
|
|
||||||
run: echo "BUILD_CMD=cross" >> $GITHUB_ENV
|
|
||||||
|
|
||||||
- name: Show version information (Rust, cargo, GCC)
|
- name: Show version information (Rust, cargo, GCC)
|
||||||
shell: bash
|
shell: bash
|
||||||
@@ -181,11 +183,14 @@ jobs:
|
|||||||
rustc -V
|
rustc -V
|
||||||
|
|
||||||
- name: Build
|
- name: Build
|
||||||
shell: bash
|
uses: actions-rs/cargo@v1
|
||||||
run: $BUILD_CMD build --locked --release --target=${{ matrix.job.target }}
|
with:
|
||||||
|
use-cross: ${{ matrix.job.use-cross }}
|
||||||
|
command: build
|
||||||
|
args: --locked --release --target=${{ matrix.job.target }}
|
||||||
|
|
||||||
- name: Set bin name & path
|
- name: Strip debug information from executable
|
||||||
id: bin
|
id: strip
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
# Figure out suffix of binary
|
# Figure out suffix of binary
|
||||||
@@ -194,13 +199,31 @@ jobs:
|
|||||||
*-pc-windows-*) EXE_suffix=".exe" ;;
|
*-pc-windows-*) EXE_suffix=".exe" ;;
|
||||||
esac;
|
esac;
|
||||||
|
|
||||||
# Setup paths
|
# Figure out what strip tool to use if any
|
||||||
BIN_NAME="${{ env.PROJECT_NAME }}${EXE_suffix}"
|
STRIP="strip"
|
||||||
BIN_PATH="target/${{ matrix.job.target }}/release/${BIN_NAME}"
|
case ${{ matrix.job.target }} in
|
||||||
|
arm-unknown-linux-*) STRIP="arm-linux-gnueabihf-strip" ;;
|
||||||
|
aarch64-unknown-linux-gnu) STRIP="aarch64-linux-gnu-strip" ;;
|
||||||
|
*-pc-windows-msvc) STRIP="" ;;
|
||||||
|
esac;
|
||||||
|
|
||||||
# Let subsequent steps know where to find the bin
|
# Setup paths
|
||||||
echo "BIN_PATH=${BIN_PATH}" >> $GITHUB_OUTPUT
|
BIN_DIR="${{ env.CICD_INTERMEDIATES_DIR }}/stripped-release-bin/"
|
||||||
echo "BIN_NAME=${BIN_NAME}" >> $GITHUB_OUTPUT
|
mkdir -p "${BIN_DIR}"
|
||||||
|
BIN_NAME="${{ env.PROJECT_NAME }}${EXE_suffix}"
|
||||||
|
BIN_PATH="${BIN_DIR}/${BIN_NAME}"
|
||||||
|
|
||||||
|
# Copy the release build binary to the result location
|
||||||
|
cp "target/${{ matrix.job.target }}/release/${BIN_NAME}" "${BIN_DIR}"
|
||||||
|
|
||||||
|
# Also strip if possible
|
||||||
|
if [ -n "${STRIP}" ]; then
|
||||||
|
"${STRIP}" "${BIN_PATH}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Let subsequent steps know where to find the (stripped) bin
|
||||||
|
echo ::set-output name=BIN_PATH::${BIN_PATH}
|
||||||
|
echo ::set-output name=BIN_NAME::${BIN_NAME}
|
||||||
|
|
||||||
- name: Set testing options
|
- name: Set testing options
|
||||||
id: test-options
|
id: test-options
|
||||||
@@ -209,39 +232,63 @@ jobs:
|
|||||||
# test only library unit tests and binary for arm-type targets
|
# test only library unit tests and binary for arm-type targets
|
||||||
unset CARGO_TEST_OPTIONS
|
unset CARGO_TEST_OPTIONS
|
||||||
unset CARGO_TEST_OPTIONS ; case ${{ matrix.job.target }} in arm-* | aarch64-*) CARGO_TEST_OPTIONS="--lib --bin ${PROJECT_NAME}" ;; esac;
|
unset CARGO_TEST_OPTIONS ; case ${{ matrix.job.target }} in arm-* | aarch64-*) CARGO_TEST_OPTIONS="--lib --bin ${PROJECT_NAME}" ;; esac;
|
||||||
echo "CARGO_TEST_OPTIONS=${CARGO_TEST_OPTIONS}" >> $GITHUB_OUTPUT
|
echo ::set-output name=CARGO_TEST_OPTIONS::${CARGO_TEST_OPTIONS}
|
||||||
|
|
||||||
- name: Run tests
|
- name: Run tests
|
||||||
shell: bash
|
uses: actions-rs/cargo@v1
|
||||||
run: $BUILD_CMD test --locked --target=${{ matrix.job.target }} ${{ steps.test-options.outputs.CARGO_TEST_OPTIONS}}
|
with:
|
||||||
|
use-cross: ${{ matrix.job.use-cross }}
|
||||||
|
command: test
|
||||||
|
args: --locked --target=${{ matrix.job.target }} ${{ steps.test-options.outputs.CARGO_TEST_OPTIONS}}
|
||||||
|
|
||||||
- name: Run bat
|
- name: Run bat
|
||||||
shell: bash
|
uses: actions-rs/cargo@v1
|
||||||
run: $BUILD_CMD run --locked --target=${{ matrix.job.target }} -- --paging=never --color=always --theme=ansi Cargo.toml src/config.rs
|
with:
|
||||||
|
use-cross: ${{ matrix.job.use-cross }}
|
||||||
|
command: run
|
||||||
|
args: --locked --target=${{ matrix.job.target }} -- --paging=never --color=always --theme=ansi Cargo.toml src/config.rs
|
||||||
|
|
||||||
- name: Show diagnostics (bat --diagnostic)
|
- name: Show diagnostics (bat --diagnostic)
|
||||||
shell: bash
|
uses: actions-rs/cargo@v1
|
||||||
run: $BUILD_CMD run --locked --target=${{ matrix.job.target }} -- --paging=never --color=always --theme=ansi Cargo.toml src/config.rs --diagnostic
|
with:
|
||||||
|
use-cross: ${{ matrix.job.use-cross }}
|
||||||
|
command: run
|
||||||
|
args: --locked --target=${{ matrix.job.target }} -- --paging=never --color=always --theme=ansi Cargo.toml src/config.rs --diagnostic
|
||||||
|
|
||||||
- name: "Feature check: regex-onig"
|
- name: "Feature check: regex-onig"
|
||||||
shell: bash
|
uses: actions-rs/cargo@v1
|
||||||
run: $BUILD_CMD check --locked --target=${{ matrix.job.target }} --verbose --lib --no-default-features --features regex-onig
|
with:
|
||||||
|
use-cross: ${{ matrix.job.use-cross }}
|
||||||
|
command: check
|
||||||
|
args: --locked --target=${{ matrix.job.target }} --verbose --lib --no-default-features --features regex-onig
|
||||||
|
|
||||||
- name: "Feature check: regex-onig,git"
|
- name: "Feature check: regex-onig,git"
|
||||||
shell: bash
|
uses: actions-rs/cargo@v1
|
||||||
run: $BUILD_CMD check --locked --target=${{ matrix.job.target }} --verbose --lib --no-default-features --features regex-onig,git
|
with:
|
||||||
|
use-cross: ${{ matrix.job.use-cross }}
|
||||||
|
command: check
|
||||||
|
args: --locked --target=${{ matrix.job.target }} --verbose --lib --no-default-features --features regex-onig,git
|
||||||
|
|
||||||
- name: "Feature check: regex-onig,paging"
|
- name: "Feature check: regex-onig,paging"
|
||||||
shell: bash
|
uses: actions-rs/cargo@v1
|
||||||
run: $BUILD_CMD check --locked --target=${{ matrix.job.target }} --verbose --lib --no-default-features --features regex-onig,paging
|
with:
|
||||||
|
use-cross: ${{ matrix.job.use-cross }}
|
||||||
|
command: check
|
||||||
|
args: --locked --target=${{ matrix.job.target }} --verbose --lib --no-default-features --features regex-onig,paging
|
||||||
|
|
||||||
- name: "Feature check: regex-onig,git,paging"
|
- name: "Feature check: regex-onig,git,paging"
|
||||||
shell: bash
|
uses: actions-rs/cargo@v1
|
||||||
run: $BUILD_CMD check --locked --target=${{ matrix.job.target }} --verbose --lib --no-default-features --features regex-onig,git,paging
|
with:
|
||||||
|
use-cross: ${{ matrix.job.use-cross }}
|
||||||
|
command: check
|
||||||
|
args: --locked --target=${{ matrix.job.target }} --verbose --lib --no-default-features --features regex-onig,git,paging
|
||||||
|
|
||||||
- name: "Feature check: minimal-application"
|
- name: "Feature check: minimal-application"
|
||||||
shell: bash
|
uses: actions-rs/cargo@v1
|
||||||
run: $BUILD_CMD check --locked --target=${{ matrix.job.target }} --verbose --no-default-features --features minimal-application
|
with:
|
||||||
|
use-cross: ${{ matrix.job.use-cross }}
|
||||||
|
command: check
|
||||||
|
args: --locked --target=${{ matrix.job.target }} --verbose --no-default-features --features minimal-application
|
||||||
|
|
||||||
- name: Create tarball
|
- name: Create tarball
|
||||||
id: package
|
id: package
|
||||||
@@ -250,7 +297,7 @@ jobs:
|
|||||||
PKG_suffix=".tar.gz" ; case ${{ matrix.job.target }} in *-pc-windows-*) PKG_suffix=".zip" ;; esac;
|
PKG_suffix=".tar.gz" ; case ${{ matrix.job.target }} in *-pc-windows-*) PKG_suffix=".zip" ;; esac;
|
||||||
PKG_BASENAME=${PROJECT_NAME}-v${PROJECT_VERSION}-${{ matrix.job.target }}
|
PKG_BASENAME=${PROJECT_NAME}-v${PROJECT_VERSION}-${{ matrix.job.target }}
|
||||||
PKG_NAME=${PKG_BASENAME}${PKG_suffix}
|
PKG_NAME=${PKG_BASENAME}${PKG_suffix}
|
||||||
echo "PKG_NAME=${PKG_NAME}" >> $GITHUB_OUTPUT
|
echo ::set-output name=PKG_NAME::${PKG_NAME}
|
||||||
|
|
||||||
PKG_STAGING="${{ env.CICD_INTERMEDIATES_DIR }}/package"
|
PKG_STAGING="${{ env.CICD_INTERMEDIATES_DIR }}/package"
|
||||||
ARCHIVE_DIR="${PKG_STAGING}/${PKG_BASENAME}/"
|
ARCHIVE_DIR="${PKG_STAGING}/${PKG_BASENAME}/"
|
||||||
@@ -258,7 +305,7 @@ jobs:
|
|||||||
mkdir -p "${ARCHIVE_DIR}/autocomplete"
|
mkdir -p "${ARCHIVE_DIR}/autocomplete"
|
||||||
|
|
||||||
# Binary
|
# Binary
|
||||||
cp "${{ steps.bin.outputs.BIN_PATH }}" "$ARCHIVE_DIR"
|
cp "${{ steps.strip.outputs.BIN_PATH }}" "$ARCHIVE_DIR"
|
||||||
|
|
||||||
# Man page
|
# Man page
|
||||||
cp 'target/${{ matrix.job.target }}/release/build/${{ env.PROJECT_NAME }}'-*/out/assets/manual/bat.1 "$ARCHIVE_DIR"
|
cp 'target/${{ matrix.job.target }}/release/build/${{ env.PROJECT_NAME }}'-*/out/assets/manual/bat.1 "$ARCHIVE_DIR"
|
||||||
@@ -281,7 +328,7 @@ jobs:
|
|||||||
popd >/dev/null
|
popd >/dev/null
|
||||||
|
|
||||||
# Let subsequent steps know where to find the compressed package
|
# Let subsequent steps know where to find the compressed package
|
||||||
echo "PKG_PATH=${PKG_STAGING}/${PKG_NAME}" >> $GITHUB_OUTPUT
|
echo ::set-output name=PKG_PATH::"${PKG_STAGING}/${PKG_NAME}"
|
||||||
|
|
||||||
- name: Create Debian package
|
- name: Create Debian package
|
||||||
id: debian-package
|
id: debian-package
|
||||||
@@ -308,10 +355,10 @@ jobs:
|
|||||||
esac;
|
esac;
|
||||||
|
|
||||||
DPKG_NAME="${DPKG_BASENAME}_${DPKG_VERSION}_${DPKG_ARCH}.deb"
|
DPKG_NAME="${DPKG_BASENAME}_${DPKG_VERSION}_${DPKG_ARCH}.deb"
|
||||||
echo "DPKG_NAME=${DPKG_NAME}" >> $GITHUB_OUTPUT
|
echo ::set-output name=DPKG_NAME::${DPKG_NAME}
|
||||||
|
|
||||||
# Binary
|
# Binary
|
||||||
install -Dm755 "${{ steps.bin.outputs.BIN_PATH }}" "${DPKG_DIR}/usr/bin/${{ steps.bin.outputs.BIN_NAME }}"
|
install -Dm755 "${{ steps.strip.outputs.BIN_PATH }}" "${DPKG_DIR}/usr/bin/${{ steps.strip.outputs.BIN_NAME }}"
|
||||||
|
|
||||||
# Man page
|
# Man page
|
||||||
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"
|
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"
|
||||||
@@ -387,7 +434,7 @@ jobs:
|
|||||||
EOF
|
EOF
|
||||||
|
|
||||||
DPKG_PATH="${DPKG_STAGING}/${DPKG_NAME}"
|
DPKG_PATH="${DPKG_STAGING}/${DPKG_NAME}"
|
||||||
echo "DPKG_PATH=${DPKG_PATH}" >> $GITHUB_OUTPUT
|
echo ::set-output name=DPKG_PATH::${DPKG_PATH}
|
||||||
|
|
||||||
# build dpkg
|
# build dpkg
|
||||||
fakeroot dpkg-deb --build "${DPKG_DIR}" "${DPKG_PATH}"
|
fakeroot dpkg-deb --build "${DPKG_DIR}" "${DPKG_PATH}"
|
||||||
@@ -410,7 +457,7 @@ jobs:
|
|||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
unset IS_RELEASE ; if [[ $GITHUB_REF =~ ^refs/tags/v[0-9].* ]]; then IS_RELEASE='true' ; fi
|
unset IS_RELEASE ; if [[ $GITHUB_REF =~ ^refs/tags/v[0-9].* ]]; then IS_RELEASE='true' ; fi
|
||||||
echo "IS_RELEASE=${IS_RELEASE}" >> $GITHUB_OUTPUT
|
echo ::set-output name=IS_RELEASE::${IS_RELEASE}
|
||||||
|
|
||||||
- name: Publish archives and packages
|
- name: Publish archives and packages
|
||||||
uses: softprops/action-gh-release@v1
|
uses: softprops/action-gh-release@v1
|
||||||
|
18
.gitmodules
vendored
18
.gitmodules
vendored
@@ -236,21 +236,3 @@
|
|||||||
[submodule "assets/syntaxes/02_Extra/Dart"]
|
[submodule "assets/syntaxes/02_Extra/Dart"]
|
||||||
path = assets/syntaxes/02_Extra/Dart
|
path = assets/syntaxes/02_Extra/Dart
|
||||||
url = https://github.com/elMuso/Dartlight.git
|
url = https://github.com/elMuso/Dartlight.git
|
||||||
[submodule "assets/syntaxes/02_Extra/SublimeJQ"]
|
|
||||||
path = assets/syntaxes/02_Extra/SublimeJQ
|
|
||||||
url = https://github.com/zogwarg/SublimeJQ.git
|
|
||||||
[submodule "assets/syntaxes/02_Extra/cmd-help"]
|
|
||||||
path = assets/syntaxes/02_Extra/cmd-help
|
|
||||||
url = https://github.com/victor-gp/cmd-help-sublime-syntax.git
|
|
||||||
branch = main
|
|
||||||
shallow = true
|
|
||||||
[submodule "assets/syntaxes/02_Extra/TodoTxt"]
|
|
||||||
path = assets/syntaxes/02_Extra/TodoTxt
|
|
||||||
url = https://github.com/dertuxmalwieder/SublimeTodoTxt
|
|
||||||
[submodule "assets/syntaxes/02_Extra/Ada"]
|
|
||||||
path = assets/syntaxes/02_Extra/Ada
|
|
||||||
url = https://github.com/wiremoons/ada-sublime-syntax
|
|
||||||
|
|
||||||
[submodule "assets/syntaxes/02_Extra/Crontab"]
|
|
||||||
path = assets/syntaxes/02_Extra/Crontab
|
|
||||||
url = https://github.com/michaelblyons/SublimeSyntax-Crontab
|
|
||||||
|
132
CHANGELOG.md
132
CHANGELOG.md
@@ -1,134 +1,12 @@
|
|||||||
# v0.23.0
|
# unreleased
|
||||||
|
|
||||||
## Features
|
|
||||||
|
|
||||||
- Implemented `-S` and `--chop-long-lines` flags as aliases for `--wrap=never`. See #2309 (@johnmatthiggins)
|
|
||||||
- Breaking change: Environment variables can now override config file settings (but command-line arguments still have the highest precedence), see #1152, #1281, and #2381 (@aaronkollasch)
|
|
||||||
- Implemented `--nonprintable-notation=caret` to support showing non-printable characters using caret notation. See #2429 (@einfachIrgendwer0815)
|
|
||||||
|
|
||||||
## Bugfixes
|
|
||||||
|
|
||||||
- Fix `bat cache --clear` not clearing the `--target` dir if specified. See #2393 (@miles170)
|
|
||||||
|
|
||||||
## Other
|
|
||||||
|
|
||||||
- Various bash completion improvements, see #2310 (@scop)
|
|
||||||
- Disable completion of `cache` subcommand, see #2399 (@cyqsimon)
|
|
||||||
- Signifigantly improve startup performance on macOS, see #2442 (@BlackHoleFox)
|
|
||||||
- Bump MSRV to 1.62, see #2496 (@Enselic)
|
|
||||||
|
|
||||||
## Syntaxes
|
|
||||||
|
|
||||||
- Added support for Ada, see #1300 and #2316 (@dkm)
|
|
||||||
- Added `todo.txt` syntax, see #2375 (@BANOnotIT)
|
|
||||||
- Improve Manpage.sublime-syntax. See #2364 (@Freed-Wu) and #2461 (@keith-hall)
|
|
||||||
- Added a new `requirements.txt` syntax, see #2361 (@Freed-Wu)
|
|
||||||
- Added a new VimHelp syntax, see #2366 (@Freed-Wu)
|
|
||||||
- Associate `pdm.lock` with `TOML` syntax, see #2410
|
|
||||||
- `Todo.txt`: Fix highlighting of contexts and projects at beginning of done.txt, see #2411
|
|
||||||
- `cmd-help`: overhaul scope names (colors) to improve theme support; misc syntax improvements. See #2419 (@victor-gp)
|
|
||||||
- Added support for Crontab, see #2509 (@keith-hall)
|
|
||||||
|
|
||||||
## Themes
|
|
||||||
|
|
||||||
## `bat` as a library
|
|
||||||
|
|
||||||
- `PrettyPrinter::header` correctly displays a header with the filename, see #2378 and #2406 (@cstyles)
|
|
||||||
|
|
||||||
|
|
||||||
# v0.22.1
|
|
||||||
|
|
||||||
## Bugfixes
|
|
||||||
|
|
||||||
- Bring back pre-processing of ANSI escape characters to so that some common `bat` use cases starts working again. See #2308 (@Enselic)
|
|
||||||
|
|
||||||
# v0.22.0
|
|
||||||
|
|
||||||
## Features
|
|
||||||
|
|
||||||
- Make the default macOS theme depend on Dark Mode. See #2197, #1746 (@Enselic)
|
|
||||||
- Support for separate system and user config files. See #668 (@patrickpichler)
|
|
||||||
|
|
||||||
## Bugfixes
|
|
||||||
|
|
||||||
- Prevent fork nightmare with `PAGER=batcat`. See #2235 (@johnmatthiggins)
|
|
||||||
- Make `--no-paging`/`-P` override `--paging=...` if passed as a later arg, see #2201 (@themkat)
|
|
||||||
- `--map-syntax` and `--ignored-suffix` now works together, see #2093 (@czzrr)
|
|
||||||
- Strips byte order mark from output when in non-loop-through mode. See #1922 (@dag-h)
|
|
||||||
|
|
||||||
## Other
|
|
||||||
|
|
||||||
- Relaxed glibc requirements on amd64, see #2106 and #2194 (@sharkdp)
|
|
||||||
- Improved fish completions. See #2275 (@zgracem)
|
|
||||||
- Stop pre-processing ANSI escape characters. Syntax highlighting on ANSI escaped input is not supported. See #2185 and #2189 (@Enselic)
|
|
||||||
|
|
||||||
## Syntaxes
|
|
||||||
|
|
||||||
- NSE (Nmap Scripting Engine) is mapped to Lua, see #2151 (@Cre3per)
|
|
||||||
- Correctly color `fstab` dump and pass fields, see #2246 (@yuvalmo)
|
|
||||||
- Update `Command Help` syntax, see #2255
|
|
||||||
- `Julia`: Fix syntax highlighting for function name starting with `struct`, see #2230
|
|
||||||
- Minor update to `LiveScript`, see #2291
|
|
||||||
- Associate `.mts` and `.cts` files with the `TypeScript` syntax. See #2236 (@kidonng)
|
|
||||||
- Fish history is mapped to YAML. See #2237 (@kidonng)
|
|
||||||
|
|
||||||
## `bat` as a library
|
|
||||||
|
|
||||||
- Make `bat::PrettyPrinter::syntaxes()` iterate over new `bat::Syntax` struct instead of `&syntect::parsing::SyntaxReference`. See #2222 (@Enselic)
|
|
||||||
- Clear highlights after printing, see #1919 and #1920 (@rhysd)
|
|
||||||
|
|
||||||
|
|
||||||
# v0.21.0
|
|
||||||
|
|
||||||
## Features
|
|
||||||
|
|
||||||
- Correctly render tab stops in `--show-all`, see #2038 (@Synthetica9)
|
|
||||||
- Add a `--style=default` option and make it the default. It is less verbose than `full`, see #2061 (@IsaacHorvath)
|
|
||||||
- Enable BusyBox `less` as pager, see #2162 (@nfisher1226)
|
|
||||||
- File extensions are now matched case-insensitively. See #1854, #2181 (@Enselic)
|
|
||||||
|
|
||||||
## Bugfixes
|
|
||||||
|
|
||||||
- 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)
|
|
||||||
- `bat` no longer crashes when encountering files that references missing syntaxes. See #915, #2181 (@Enselic)
|
|
||||||
|
|
||||||
## Performance
|
|
||||||
|
|
||||||
- Skip syntax highlighting on long lines (> 16384 chars) to help improve performance. See #2165 (@keith-hall)
|
|
||||||
- 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)
|
|
||||||
|
|
||||||
## Other
|
|
||||||
|
|
||||||
- Include info about custom assets in `--diagnostics` if used. See #2107, #2144 (@Enselic)
|
|
||||||
|
|
||||||
## Syntaxes
|
|
||||||
|
|
||||||
- Mapped clang-format config file (.clang-format) to YAML syntax (@TruncatedDinosour)
|
|
||||||
- log syntax: improved handling of escape characters in double quoted strings. See #2123 (@keith-hall)
|
|
||||||
- Associate `/var/spool/mail/*` and `/var/mail/*` with the `Email` syntax. See #2156 (@cyqsimon)
|
|
||||||
- Added cmd-help syntax to scope --help messages. See #2148 (@victor-gp)
|
|
||||||
- Slightly adjust Zig syntax. See #2136 (@Enselic)
|
|
||||||
- Associate `.inf` files with the `INI` syntax. See #2190 (@Enselic)
|
|
||||||
|
|
||||||
## `bat` as a library
|
|
||||||
|
|
||||||
- Allow configuration of `show_nonprintable` with `PrettyPrinter`, see #2142
|
|
||||||
- The binary format of syntaxes.bin has been changed due to syntaxes now being lazy-loaded via syntect 5.0.0. See #2181 (@Enselic)
|
|
||||||
- Mark `bat::error::Error` enum as `#[non_exhaustive]` to allow adding new variants without future semver breakage. See #2181 (@Enselic)
|
|
||||||
- Change `Error::SyntectError(syntect::LoadingError)` to `Error::SyntectError(syntect::Error)`. See #2181 (@Enselic)
|
|
||||||
- Add `Error::SyntectLoadingError(syntect::LoadingError)` enum variant. See #2181 (@Enselic)
|
|
||||||
|
|
||||||
|
|
||||||
# v0.20.0
|
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
- New style component `header-filesize` to show size of the displayed file in the header. See #1988 (@mdibaiee)
|
- New style component `header-filesize` to show size of the displayed file in the header. See #1988 (@mdibaiee)
|
||||||
- Use underline for line highlighting on ANSI, see #1730 (@mdibaiee)
|
|
||||||
|
|
||||||
## Bugfixes
|
## Bugfixes
|
||||||
|
|
||||||
- Fix bash completion on bash 3.x and bash-completion 1.x. See #2066 (@joshpencheon)
|
## Other
|
||||||
|
|
||||||
## Syntaxes
|
## Syntaxes
|
||||||
|
|
||||||
@@ -136,14 +14,12 @@
|
|||||||
- Associate `_vimrc` and `_gvimrc` files with the `VimL` syntax. See #2002
|
- Associate `_vimrc` and `_gvimrc` files with the `VimL` syntax. See #2002
|
||||||
- Associate `poetry.lock` files with the `TOML` syntax. See #2049
|
- Associate `poetry.lock` files with the `TOML` syntax. See #2049
|
||||||
- Associate `.mesh`, `.task`, `.rgen`, `.rint`, `.rahit`, `.rchit`, `.rmiss`, and `.rcall` with the `GLSL` syntax. See #2050
|
- Associate `.mesh`, `.task`, `.rgen`, `.rint`, `.rahit`, `.rchit`, `.rmiss`, and `.rcall` with the `GLSL` syntax. See #2050
|
||||||
- Added support for `JQ` syntax, see #2072
|
|
||||||
- Properly associate global git config files rooted in `$XDG_CONFIG_HOME/git/` or `$HOME/.config/git/`. See #2067 (@cyqsimon)
|
## Themes
|
||||||
|
|
||||||
## `bat` as a library
|
## `bat` as a library
|
||||||
|
|
||||||
- Exposed `get_syntax_set` and `get_theme` methods on `HighlightingAssets`. See #2030 (@dandavison)
|
- Exposed `get_syntax_set` and `get_theme` methods on `HighlightingAssets`. See #2030 (@dandavison)
|
||||||
- Added `HeaderFilename` and `HeaderFilesize` to `StyleComponent` enum, and mark it `#[non_exhaustive]`. See #1988 (@mdibaiee)
|
|
||||||
|
|
||||||
|
|
||||||
# v0.19.0
|
# v0.19.0
|
||||||
|
|
||||||
|
@@ -33,7 +33,7 @@ section in the README.
|
|||||||
|
|
||||||
Please consider opening a
|
Please consider opening a
|
||||||
[feature request ticket](https://github.com/sharkdp/bat/issues/new?assignees=&labels=feature-request&template=feature_request.md)
|
[feature request ticket](https://github.com/sharkdp/bat/issues/new?assignees=&labels=feature-request&template=feature_request.md)
|
||||||
first in order to give us a chance to discuss the details and specifics of the potential new feature before you go and build it.
|
first in order to give us a chance to discuss the feature first.
|
||||||
|
|
||||||
|
|
||||||
## Adding new syntaxes/languages or themes
|
## Adding new syntaxes/languages or themes
|
||||||
@@ -46,25 +46,3 @@ If you really think that a particular syntax or theme should be added for all
|
|||||||
users, please read the corresponding
|
users, please read the corresponding
|
||||||
[documentation](https://github.com/sharkdp/bat/blob/master/doc/assets.md)
|
[documentation](https://github.com/sharkdp/bat/blob/master/doc/assets.md)
|
||||||
first.
|
first.
|
||||||
|
|
||||||
|
|
||||||
## Regression tests
|
|
||||||
|
|
||||||
You are **strongly encouraged** to add regression tests. Regression tests are great,
|
|
||||||
not least because they:
|
|
||||||
|
|
||||||
* ensure that your contribution will never completely stop working.
|
|
||||||
|
|
||||||
* makes code reviews easier, because it becomes very clear what the code is
|
|
||||||
supposed to do.
|
|
||||||
|
|
||||||
For functional changes, you most likely want to add a test to
|
|
||||||
[`tests/integration_tests.rs`](https://github.com/sharkdp/bat/blob/master/tests/integration_tests.rs).
|
|
||||||
Look at existing tests to know how to write a new test. In short, you will
|
|
||||||
invoke the `bat` binary with a certain set of arguments, and then assert on
|
|
||||||
stdout/stderr.
|
|
||||||
|
|
||||||
To learn how to write regression tests for theme and syntax changes, read the
|
|
||||||
[Syntax
|
|
||||||
tests](https://github.com/sharkdp/bat/blob/master/doc/assets.md#syntax-tests)
|
|
||||||
section in `assets.md`.
|
|
||||||
|
703
Cargo.lock
generated
703
Cargo.lock
generated
File diff suppressed because it is too large
Load Diff
59
Cargo.toml
59
Cargo.toml
@@ -6,11 +6,10 @@ homepage = "https://github.com/sharkdp/bat"
|
|||||||
license = "MIT/Apache-2.0"
|
license = "MIT/Apache-2.0"
|
||||||
name = "bat"
|
name = "bat"
|
||||||
repository = "https://github.com/sharkdp/bat"
|
repository = "https://github.com/sharkdp/bat"
|
||||||
version = "0.23.0"
|
version = "0.19.0"
|
||||||
exclude = ["assets/syntaxes/*", "assets/themes/*"]
|
exclude = ["assets/syntaxes/*", "assets/themes/*"]
|
||||||
build = "build.rs"
|
build = "build.rs"
|
||||||
edition = '2018'
|
edition = '2018'
|
||||||
rust-version = "1.64"
|
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
default = ["application"]
|
default = ["application"]
|
||||||
@@ -27,14 +26,15 @@ application = [
|
|||||||
minimal-application = [
|
minimal-application = [
|
||||||
"atty",
|
"atty",
|
||||||
"clap",
|
"clap",
|
||||||
"dirs",
|
"dirs-next",
|
||||||
"paging",
|
"paging",
|
||||||
"regex-onig",
|
"regex-onig",
|
||||||
"wild",
|
"wild",
|
||||||
]
|
]
|
||||||
git = ["git2"] # Support indicating git modifications
|
git = ["git2"] # Support indicating git modifications
|
||||||
paging = ["shell-words", "grep-cli"] # Support applying a pager on the output
|
paging = ["shell-words", "grep-cli"] # Support applying a pager on the output
|
||||||
build-assets = ["syntect/yaml-load", "syntect/plist-load", "regex", "walkdir"]
|
# Add "syntect/plist-load" when https://github.com/trishume/syntect/pull/345 reaches us
|
||||||
|
build-assets = ["syntect/yaml-load", "syntect/dump-create", "regex", "walkdir"]
|
||||||
|
|
||||||
# You need to use one of these if you depend on bat as a library:
|
# You need to use one of these if you depend on bat as a library:
|
||||||
regex-onig = ["syntect/regex-onig"] # Use the "oniguruma" regex engine
|
regex-onig = ["syntect/regex-onig"] # Use the "oniguruma" regex engine
|
||||||
@@ -42,67 +42,60 @@ regex-fancy = ["syntect/regex-fancy"] # Use the rust-only "fancy-regex" engine
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
atty = { version = "0.2.14", optional = true }
|
atty = { version = "0.2.14", optional = true }
|
||||||
nu-ansi-term = "0.47.0"
|
ansi_term = "^0.12.1"
|
||||||
ansi_colours = "^1.2"
|
ansi_colours = "^1.1"
|
||||||
bincode = "1.0"
|
bincode = "1.0"
|
||||||
console = "0.15.5"
|
console = "0.15.0"
|
||||||
flate2 = "1.0"
|
flate2 = "1.0"
|
||||||
once_cell = "1.17"
|
once_cell = "1.9"
|
||||||
thiserror = "1.0"
|
thiserror = "1.0"
|
||||||
wild = { version = "2.1", optional = true }
|
wild = { version = "2.0", optional = true }
|
||||||
content_inspector = "0.2.4"
|
content_inspector = "0.2.4"
|
||||||
encoding = "0.2"
|
encoding = "0.2"
|
||||||
shell-words = { version = "1.1.0", optional = true }
|
shell-words = { version = "1.0.0", optional = true }
|
||||||
unicode-width = "0.1.10"
|
unicode-width = "0.1.9"
|
||||||
globset = "0.4"
|
globset = "0.4"
|
||||||
serde = { version = "1.0", features = ["derive"] }
|
serde = { version = "1.0", features = ["derive"] }
|
||||||
serde_yaml = "0.8"
|
serde_yaml = "0.8"
|
||||||
semver = "1.0"
|
semver = "1.0"
|
||||||
path_abs = { version = "0.5", default-features = false }
|
path_abs = { version = "0.5", default-features = false }
|
||||||
clircle = "0.3"
|
clircle = "0.3"
|
||||||
bugreport = { version = "0.5.0", optional = true }
|
bugreport = { version = "0.4", optional = true }
|
||||||
dirs = { version = "5.0.0", optional = true }
|
dirs-next = { version = "2.0.0", optional = true }
|
||||||
grep-cli = { version = "0.1.7", optional = true }
|
grep-cli = { version = "0.1.6", optional = true }
|
||||||
regex = { version = "1.7.0", optional = true }
|
regex = { version = "1.0", optional = true }
|
||||||
walkdir = { version = "2.0", optional = true }
|
walkdir = { version = "2.0", optional = true }
|
||||||
bytesize = { version = "1.1.0" }
|
bytesize = { version = "1.1.0" }
|
||||||
|
|
||||||
[dependencies.git2]
|
[dependencies.git2]
|
||||||
version = "0.16"
|
version = "0.13"
|
||||||
optional = true
|
optional = true
|
||||||
default-features = false
|
default-features = false
|
||||||
|
|
||||||
[dependencies.syntect]
|
[dependencies.syntect]
|
||||||
version = "5.0.0"
|
version = "4.6.0"
|
||||||
default-features = false
|
default-features = false
|
||||||
features = ["parsing"]
|
features = ["parsing"]
|
||||||
|
|
||||||
[dependencies.clap]
|
[dependencies.clap]
|
||||||
version = "4.1.8"
|
version = "2.34"
|
||||||
optional = true
|
optional = true
|
||||||
features = ["wrap_help", "cargo"]
|
default-features = false
|
||||||
|
features = ["suggestions", "color", "wrap_help"]
|
||||||
[target.'cfg(target_os = "macos")'.dependencies]
|
|
||||||
dirs = "5.0.0"
|
|
||||||
plist = "1.3"
|
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
assert_cmd = "2.0.8"
|
assert_cmd = "2.0.4"
|
||||||
expect-test = "1.4.0"
|
serial_test = "0.5.1"
|
||||||
serial_test = "0.6.0"
|
predicates = "2.1.0"
|
||||||
predicates = "2.1.5"
|
|
||||||
wait-timeout = "0.2.0"
|
wait-timeout = "0.2.0"
|
||||||
tempfile = "3.3.0"
|
tempfile = "3.3.0"
|
||||||
|
|
||||||
[target.'cfg(unix)'.dev-dependencies]
|
[target.'cfg(unix)'.dev-dependencies]
|
||||||
nix = { version = "0.26.2", default-features = false, features = ["term"] }
|
nix = "0.23.1"
|
||||||
|
|
||||||
[build-dependencies.clap]
|
[build-dependencies]
|
||||||
version = "4.1.8"
|
clap = { version = "2.34", optional = true }
|
||||||
optional = true
|
|
||||||
features = ["wrap_help", "cargo"]
|
|
||||||
|
|
||||||
[profile.release]
|
[profile.release]
|
||||||
lto = true
|
lto = true
|
||||||
strip = true
|
|
||||||
codegen-units = 1
|
codegen-units = 1
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
Copyright (c) 2018-2023 bat-developers (https://github.com/sharkdp/bat).
|
Copyright (c) 2018-2021 bat-developers (https://github.com/sharkdp/bat).
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
32
README.md
32
README.md
@@ -21,7 +21,7 @@
|
|||||||
|
|
||||||
### Sponsors
|
### Sponsors
|
||||||
|
|
||||||
A special *thank you* goes to our biggest <a href="doc/sponsors.md">sponsors</a>:<br>
|
a special thank you goes to our biggest <a href="doc/sponsors.md">sponsors</a>:<br>
|
||||||
<a href="https://workos.com/?utm_campaign=github_repo&utm_medium=referral&utm_content=bat&utm_source=github">
|
<a href="https://workos.com/?utm_campaign=github_repo&utm_medium=referral&utm_content=bat&utm_source=github">
|
||||||
<img src="doc/sponsors/workos-logo-white-bg.svg" width="200" alt="WorkOS">
|
<img src="doc/sponsors/workos-logo-white-bg.svg" width="200" alt="WorkOS">
|
||||||
<br>
|
<br>
|
||||||
@@ -171,7 +171,7 @@ You can combine `bat` with `git diff` to view lines around code changes with pro
|
|||||||
highlighting:
|
highlighting:
|
||||||
```bash
|
```bash
|
||||||
batdiff() {
|
batdiff() {
|
||||||
git diff --name-only --relative --diff-filter=d | xargs bat --diff
|
git diff --name-only --diff-filter=d | xargs bat --diff
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
If you prefer to use this as a separate tool, check out `batdiff` in [`bat-extras`](https://github.com/eth-p/bat-extras).
|
If you prefer to use this as a separate tool, check out `batdiff` in [`bat-extras`](https://github.com/eth-p/bat-extras).
|
||||||
@@ -212,24 +212,6 @@ Also, note that this will [not work](https://github.com/sharkdp/bat/issues/1145)
|
|||||||
|
|
||||||
The [`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`.
|
The [`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`.
|
||||||
|
|
||||||
#### Highlighting `--help` messages
|
|
||||||
|
|
||||||
You can use `bat` to colorize help text: `$ cp --help | bat -plhelp`
|
|
||||||
|
|
||||||
You can also use a wrapper around this:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# in your .bashrc/.zshrc/*rc
|
|
||||||
alias bathelp='bat --plain --language=help'
|
|
||||||
help() {
|
|
||||||
"$@" --help 2>&1 | bathelp
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
Then you can do `$ help cp` or `$ help git commit`.
|
|
||||||
|
|
||||||
Please report any issues with the help syntax in [this repository](https://github.com/victor-gp/cmd-help-sublime-syntax).
|
|
||||||
|
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
@@ -367,7 +349,7 @@ Existing packages may be available, but are not officially supported and may con
|
|||||||
|
|
||||||
### On macOS (or Linux) via Homebrew
|
### On macOS (or Linux) via Homebrew
|
||||||
|
|
||||||
You can install `bat` with [Homebrew](https://formulae.brew.sh/formula/bat):
|
You can install `bat` with [Homebrew on MacOS](https://formulae.brew.sh/formula/bat) or [Homebrew on Linux](https://formulae.brew.sh/formula-linux/bat):
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
brew install bat
|
brew install bat
|
||||||
@@ -418,7 +400,7 @@ binaries are also available: look for archives with `musl` in the file name.
|
|||||||
|
|
||||||
### From source
|
### From source
|
||||||
|
|
||||||
If you want to build `bat` from source, you need Rust 1.64.0 or
|
If you want to build `bat` from source, you need Rust 1.51 or
|
||||||
higher. You can then use `cargo` to build everything:
|
higher. You can then use `cargo` to build everything:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
@@ -639,10 +621,6 @@ A default configuration file can be created with the `--generate-config-file` op
|
|||||||
bat --generate-config-file
|
bat --generate-config-file
|
||||||
```
|
```
|
||||||
|
|
||||||
There is also now a systemwide configuration file, which is located under `/etc/bat/config` on
|
|
||||||
Linux and Mac OS and `C:\ProgramData\bat\config` on windows. If the system wide configuration
|
|
||||||
file is present, the content of the user configuration will simply be appended to it.
|
|
||||||
|
|
||||||
### Format
|
### Format
|
||||||
|
|
||||||
The configuration file is a simple list of command line arguments. Use `bat --help` to see a full list of possible options and values. In addition, you can add comments by prepending a line with the `#` character.
|
The configuration file is a simple list of command line arguments. Use `bat --help` to see a full list of possible options and values. In addition, you can add comments by prepending a line with the `#` character.
|
||||||
@@ -801,7 +779,7 @@ There are a lot of alternatives, if you are looking for similar programs. See
|
|||||||
[this document](doc/alternatives.md) for a comparison.
|
[this document](doc/alternatives.md) for a comparison.
|
||||||
|
|
||||||
## License
|
## License
|
||||||
Copyright (c) 2018-2023 [bat-developers](https://github.com/sharkdp/bat).
|
Copyright (c) 2018-2021 [bat-developers](https://github.com/sharkdp/bat).
|
||||||
|
|
||||||
`bat` is made available under the terms of either the MIT License or the Apache License 2.0, at your option.
|
`bat` is made available under the terms of either the MIT License or the Apache License 2.0, at your option.
|
||||||
|
|
||||||
|
BIN
assets/acknowledgements.bin
vendored
BIN
assets/acknowledgements.bin
vendored
Binary file not shown.
5
assets/completions/_bat.ps1.in
vendored
5
assets/completions/_bat.ps1.in
vendored
@@ -37,7 +37,7 @@ Register-ArgumentCompleter -Native -CommandName '{{PROJECT_EXECUTABLE}}' -Script
|
|||||||
[CompletionResult]::new('-m', 'm', [CompletionResultType]::ParameterName, 'Use the specified syntax for files matching the glob pattern (''*.cpp:C++'').')
|
[CompletionResult]::new('-m', 'm', [CompletionResultType]::ParameterName, 'Use the specified syntax for files matching the glob pattern (''*.cpp:C++'').')
|
||||||
[CompletionResult]::new('--map-syntax', 'map-syntax', [CompletionResultType]::ParameterName, 'Use the specified syntax for files matching the glob pattern (''*.cpp:C++'').')
|
[CompletionResult]::new('--map-syntax', 'map-syntax', [CompletionResultType]::ParameterName, 'Use the specified syntax for files matching the glob pattern (''*.cpp:C++'').')
|
||||||
[CompletionResult]::new('--theme', 'theme', [CompletionResultType]::ParameterName, 'Set the color theme for syntax highlighting.')
|
[CompletionResult]::new('--theme', 'theme', [CompletionResultType]::ParameterName, 'Set the color theme for syntax highlighting.')
|
||||||
[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).')
|
[CompletionResult]::new('--style', 'style', [CompletionResultType]::ParameterName, 'Comma-separated list of style elements to display (*auto*, full, plain, changes, header, grid, rule, numbers, snip).')
|
||||||
[CompletionResult]::new('-r', 'r', [CompletionResultType]::ParameterName, 'Only print the lines from N to M.')
|
[CompletionResult]::new('-r', 'r', [CompletionResultType]::ParameterName, 'Only print the lines from N to M.')
|
||||||
[CompletionResult]::new('--line-range', 'line-range', [CompletionResultType]::ParameterName, 'Only print the lines from N to M.')
|
[CompletionResult]::new('--line-range', 'line-range', [CompletionResultType]::ParameterName, 'Only print the lines from N to M.')
|
||||||
[CompletionResult]::new('-A', 'A', [CompletionResultType]::ParameterName, 'Show non-printable characters (space, tab, newline, ..).')
|
[CompletionResult]::new('-A', 'A', [CompletionResultType]::ParameterName, 'Show non-printable characters (space, tab, newline, ..).')
|
||||||
@@ -68,8 +68,7 @@ Register-ArgumentCompleter -Native -CommandName '{{PROJECT_EXECUTABLE}}' -Script
|
|||||||
[CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Print this help message.')
|
[CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Print this help message.')
|
||||||
[CompletionResult]::new('-V', 'V', [CompletionResultType]::ParameterName, 'Show version information.')
|
[CompletionResult]::new('-V', 'V', [CompletionResultType]::ParameterName, 'Show version information.')
|
||||||
[CompletionResult]::new('--version', 'version', [CompletionResultType]::ParameterName, 'Show version information.')
|
[CompletionResult]::new('--version', 'version', [CompletionResultType]::ParameterName, 'Show version information.')
|
||||||
## Completion of the 'cache' command itself is removed for better UX
|
[CompletionResult]::new('cache', 'cache', [CompletionResultType]::ParameterValue, 'Modify the syntax-definition and theme cache')
|
||||||
## See https://github.com/sharkdp/bat/issues/2085#issuecomment-1271646802
|
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
'{{PROJECT_EXECUTABLE}};cache' {
|
'{{PROJECT_EXECUTABLE}};cache' {
|
||||||
|
138
assets/completions/bat.bash.in
vendored
138
assets/completions/bat.bash.in
vendored
@@ -2,43 +2,9 @@
|
|||||||
|
|
||||||
# Requires https://github.com/scop/bash-completion
|
# Requires https://github.com/scop/bash-completion
|
||||||
|
|
||||||
# Macs have bash3 for which the bash-completion package doesn't include
|
|
||||||
# _init_completion. This is a minimal version of that function.
|
|
||||||
__bat_init_completion()
|
|
||||||
{
|
|
||||||
COMPREPLY=()
|
|
||||||
_get_comp_words_by_ref "$@" cur prev words cword
|
|
||||||
}
|
|
||||||
|
|
||||||
__bat_escape_completions()
|
|
||||||
{
|
|
||||||
# Do not escape if completing a quoted value.
|
|
||||||
[[ $cur == [\"\']* ]] && return 0
|
|
||||||
# printf -v to an array index is available in bash >= 4.1.
|
|
||||||
# Use it if available, as -o filenames is semantically incorrect if
|
|
||||||
# we are not actually completing filenames, and it has side effects
|
|
||||||
# (e.g. adds trailing slash to candidates matching present dirs).
|
|
||||||
if ((
|
|
||||||
BASH_VERSINFO[0] > 4 || \
|
|
||||||
BASH_VERSINFO[0] == 4 && BASH_VERSINFO[1] > 0
|
|
||||||
)); then
|
|
||||||
local i
|
|
||||||
for i in ${!COMPREPLY[*]}; do
|
|
||||||
printf -v "COMPREPLY[i]" %q "${COMPREPLY[i]}"
|
|
||||||
done
|
|
||||||
else
|
|
||||||
compopt -o filenames
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
_bat() {
|
_bat() {
|
||||||
local cur prev words cword split=false
|
local cur prev words cword split
|
||||||
if declare -F _init_completion >/dev/null 2>&1; then
|
_init_completion -s || return 0
|
||||||
_init_completion -s || return 0
|
|
||||||
else
|
|
||||||
__bat_init_completion -n "=" || return 0
|
|
||||||
_split_longopt && split=true
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ ${words[1]-} == cache ]]; then
|
if [[ ${words[1]-} == cache ]]; then
|
||||||
case $prev in
|
case $prev in
|
||||||
@@ -48,12 +14,7 @@ _bat() {
|
|||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
COMPREPLY=($(compgen -W "
|
COMPREPLY=($(compgen -W "
|
||||||
--build
|
--build --clear --source --target --blank --help
|
||||||
--clear
|
|
||||||
--source
|
|
||||||
--target
|
|
||||||
--blank
|
|
||||||
--help
|
|
||||||
" -- "$cur"))
|
" -- "$cur"))
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
@@ -66,26 +27,13 @@ _bat() {
|
|||||||
printf "%s\n" "$lang"
|
printf "%s\n" "$lang"
|
||||||
done
|
done
|
||||||
)" -- "$cur"))
|
)" -- "$cur"))
|
||||||
__bat_escape_completions
|
compopt -o filenames # for escaping
|
||||||
return 0
|
return 0
|
||||||
;;
|
;;
|
||||||
-H | --highlight-line | \
|
-H | --highlight-line | --diff-context | --tabs | --terminal-width | \
|
||||||
--diff-context | \
|
-m | --map-syntax | --style | --line-range | -h | --help | -V | \
|
||||||
--tabs | \
|
--version | --diagnostic | --config-file | --config-dir | \
|
||||||
--terminal-width | \
|
--cache-dir | --generate-config-file)
|
||||||
-m | --map-syntax | \
|
|
||||||
--ignored-suffix | \
|
|
||||||
--list-themes | \
|
|
||||||
--line-range | \
|
|
||||||
-L | --list-languages | \
|
|
||||||
--diagnostic | \
|
|
||||||
--acknowledgements | \
|
|
||||||
-h | --help | \
|
|
||||||
-V | --version | \
|
|
||||||
--cache-dir | \
|
|
||||||
--config-dir | \
|
|
||||||
--config-file | \
|
|
||||||
--generate-config-file)
|
|
||||||
# argument required but no completion available, or option
|
# argument required but no completion available, or option
|
||||||
# causes an exit
|
# causes an exit
|
||||||
return 0
|
return 0
|
||||||
@@ -113,78 +61,28 @@ _bat() {
|
|||||||
--theme)
|
--theme)
|
||||||
local IFS=$'\n'
|
local IFS=$'\n'
|
||||||
COMPREPLY=($(compgen -W "$("$1" --list-themes)" -- "$cur"))
|
COMPREPLY=($(compgen -W "$("$1" --list-themes)" -- "$cur"))
|
||||||
__bat_escape_completions
|
compopt -o filenames # for escaping
|
||||||
return 0
|
return 0
|
||||||
;;
|
;;
|
||||||
--style)
|
|
||||||
# shellcheck disable=SC2034
|
|
||||||
local -a styles=(
|
|
||||||
default
|
|
||||||
full
|
|
||||||
auto
|
|
||||||
plain
|
|
||||||
changes
|
|
||||||
header
|
|
||||||
header-filename
|
|
||||||
header-filesize
|
|
||||||
grid
|
|
||||||
rule
|
|
||||||
numbers
|
|
||||||
snip
|
|
||||||
)
|
|
||||||
# shellcheck disable=SC2016
|
|
||||||
if declare -F _comp_delimited >/dev/null 2>&1; then
|
|
||||||
# bash-completion > 2.11
|
|
||||||
_comp_delimited , -W '"${styles[@]}"'
|
|
||||||
else
|
|
||||||
COMPREPLY=($(compgen -W '${styles[@]}' -- "$cur"))
|
|
||||||
fi
|
|
||||||
return 0
|
|
||||||
esac
|
esac
|
||||||
|
|
||||||
$split && return 0
|
$split && return 0
|
||||||
|
|
||||||
if [[ $cur == -* ]]; then
|
if [[ $cur == -* ]]; then
|
||||||
# --unbuffered excluded intentionally (no-op)
|
|
||||||
COMPREPLY=($(compgen -W "
|
COMPREPLY=($(compgen -W "
|
||||||
--show-all
|
--show-all --plain --language --highlight-line
|
||||||
--plain
|
--file-name --diff --diff-context --tabs --wrap
|
||||||
--language
|
--terminal-width --number --color --italic-text
|
||||||
--highlight-line
|
--decorations --paging --pager --map-syntax --theme
|
||||||
--file-name
|
--list-themes --style --line-range --list-languages
|
||||||
--diff
|
--help --version --force-colorization --unbuffered
|
||||||
--diff-context
|
--diagnostic --config-file --config-dir --cache-dir
|
||||||
--tabs
|
|
||||||
--wrap
|
|
||||||
--terminal-width
|
|
||||||
--number
|
|
||||||
--color
|
|
||||||
--italic-text
|
|
||||||
--decorations
|
|
||||||
--force-colorization
|
|
||||||
--paging
|
|
||||||
--pager
|
|
||||||
--map-syntax
|
|
||||||
--ignored-suffix
|
|
||||||
--theme
|
|
||||||
--list-themes
|
|
||||||
--style
|
|
||||||
--line-range
|
|
||||||
--list-languages
|
|
||||||
--diagnostic
|
|
||||||
--acknowledgements
|
|
||||||
--help
|
|
||||||
--version
|
|
||||||
--cache-dir
|
|
||||||
--config-dir
|
|
||||||
--config-file
|
|
||||||
--generate-config-file
|
--generate-config-file
|
||||||
" -- "$cur"))
|
" -- "$cur"))
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
_filedir
|
_filedir
|
||||||
|
((cword == 1)) && COMPREPLY+=($(compgen -W cache -- "$cur"))
|
||||||
## Completion of the 'cache' command itself is removed for better UX
|
|
||||||
## See https://github.com/sharkdp/bat/issues/2085#issuecomment-1271646802
|
|
||||||
} && complete -F _bat {{PROJECT_EXECUTABLE}}
|
} && complete -F _bat {{PROJECT_EXECUTABLE}}
|
||||||
|
228
assets/completions/bat.fish.in
vendored
228
assets/completions/bat.fish.in
vendored
@@ -1,220 +1,78 @@
|
|||||||
# Fish Shell Completions
|
# Fish Shell Completions
|
||||||
# Copy or symlink to $XDG_CONFIG_HOME/fish/completions/{{PROJECT_EXECUTABLE}}.fish
|
# Place or symlink to $XDG_CONFIG_HOME/fish/completions/{{PROJECT_EXECUTABLE}}.fish ($XDG_CONFIG_HOME is usually set to ~/.config)
|
||||||
# ($XDG_CONFIG_HOME is usually set to ~/.config)
|
|
||||||
|
|
||||||
# `bat` is `batcat` on Debian and Ubuntu
|
# Helper function:
|
||||||
set bat {{PROJECT_EXECUTABLE}}
|
function __{{PROJECT_EXECUTABLE}}_autocomplete_languages --description "A helper function used by "(status filename)
|
||||||
|
{{PROJECT_EXECUTABLE}} --list-languages | awk -F':' '
|
||||||
|
{
|
||||||
|
lang=$1
|
||||||
|
split($2, exts, ",")
|
||||||
|
|
||||||
# Helper functions:
|
for (i in exts) {
|
||||||
|
ext=exts[i]
|
||||||
function __bat_complete_files -a token
|
if (ext !~ /[A-Z].*/ && ext !~ /^\..*rc$/) {
|
||||||
# Cheat to complete files by calling `complete -C` on a fake command name,
|
print ext"\t"lang
|
||||||
# like `__fish_complete_directories` does.
|
}
|
||||||
set -l fake_command aaabccccdeeeeefffffffffgghhhhhhiiiii
|
}
|
||||||
complete -C"$fake_command $token"
|
}
|
||||||
|
' | sort
|
||||||
end
|
end
|
||||||
|
|
||||||
function __bat_complete_one_language -a comp
|
|
||||||
command $bat --list-languages | string split -f1 : | string match -e "$comp"
|
|
||||||
end
|
|
||||||
|
|
||||||
function __bat_complete_list_languages
|
|
||||||
for spec in (command $bat --list-languages)
|
|
||||||
set -l name (string split -f1 : $spec)
|
|
||||||
for ext in (string split -f2 : $spec | string split ,)
|
|
||||||
test -n "$ext"; or continue
|
|
||||||
string match -rq '[/*]' $ext; and continue
|
|
||||||
printf "%s\t%s\n" $ext $name
|
|
||||||
end
|
|
||||||
printf "%s\t\n" $name
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function __bat_complete_map_syntax
|
|
||||||
set -l token (commandline -ct)
|
|
||||||
|
|
||||||
if string match -qr '(?<glob>.+):(?<syntax>.*)' -- $token
|
|
||||||
# If token ends with a colon, complete with the list of language names.
|
|
||||||
set -f comps $glob:(__bat_complete_one_language $syntax)
|
|
||||||
else if string match -qr '\*' -- $token
|
|
||||||
# If token contains a globbing character (`*`), complete only possible
|
|
||||||
# globs in the current directory
|
|
||||||
set -f comps (__bat_complete_files $token | string match -er '[*]'):
|
|
||||||
else
|
|
||||||
# Complete files (and globs).
|
|
||||||
set -f comps (__bat_complete_files $token | string match -erv '/$'):
|
|
||||||
end
|
|
||||||
|
|
||||||
if set -q comps[1]
|
|
||||||
printf "%s\t\n" $comps
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function __bat_cache_subcommand
|
|
||||||
__fish_seen_subcommand_from cache
|
|
||||||
end
|
|
||||||
|
|
||||||
# Returns true if no exclusive arguments seen.
|
|
||||||
function __bat_no_excl_args
|
|
||||||
not __bat_cache_subcommand; and not __fish_seen_argument \
|
|
||||||
-s h -l help \
|
|
||||||
-s V -l version \
|
|
||||||
-l acknowledgements \
|
|
||||||
-l config-dir -l config-file \
|
|
||||||
-l diagnostic \
|
|
||||||
-l list-languages -l list-themes
|
|
||||||
end
|
|
||||||
|
|
||||||
# Returns true if the 'cache' subcommand is seen without any exclusive arguments.
|
|
||||||
function __bat_cache_no_excl
|
|
||||||
__bat_cache_subcommand; and not __fish_seen_argument \
|
|
||||||
-s h -l help \
|
|
||||||
-l acknowledgements -l build -l clear
|
|
||||||
end
|
|
||||||
|
|
||||||
function __bat_style_opts
|
|
||||||
set -l style_opts \
|
|
||||||
"default,recommended components" \
|
|
||||||
"auto,same as 'default' unless piped" \
|
|
||||||
"full,all components" \
|
|
||||||
"plain,no components" \
|
|
||||||
"changes,Git change markers" \
|
|
||||||
"header,alias for header-filename" \
|
|
||||||
"header-filename,filename above content" \
|
|
||||||
"header-filesize,filesize above content" \
|
|
||||||
"grid,lines b/w sidebar/header/content" \
|
|
||||||
"numbers,line numbers in sidebar" \
|
|
||||||
"rule,separate files" \
|
|
||||||
"snip,separate ranges"
|
|
||||||
|
|
||||||
string replace , \t $style_opts
|
|
||||||
end
|
|
||||||
|
|
||||||
# Use option argument descriptions to indicate which is the default, saving
|
|
||||||
# horizontal space and making sure the option description isn't truncated.
|
|
||||||
set -l color_opts '
|
|
||||||
auto\tdefault
|
|
||||||
never\t
|
|
||||||
always\t
|
|
||||||
'
|
|
||||||
set -l decorations_opts $color_opts
|
|
||||||
set -l paging_opts $color_opts
|
|
||||||
|
|
||||||
# Include some examples so we can indicate the default.
|
|
||||||
set -l pager_opts '
|
|
||||||
less\tdefault
|
|
||||||
less\ -FR\t
|
|
||||||
more\t
|
|
||||||
vimpager\t
|
|
||||||
'
|
|
||||||
|
|
||||||
set -l italic_text_opts '
|
|
||||||
always\t
|
|
||||||
never\tdefault
|
|
||||||
'
|
|
||||||
|
|
||||||
set -l wrap_opts '
|
|
||||||
auto\tdefault
|
|
||||||
never\t
|
|
||||||
character\t
|
|
||||||
'
|
|
||||||
|
|
||||||
# While --tabs theoretically takes any number, most people should be OK with these.
|
|
||||||
# Specifying a list lets us explain what 0 does.
|
|
||||||
set -l tabs_opts '
|
|
||||||
0\tpass\ tabs\ through\ directly
|
|
||||||
1\t
|
|
||||||
2\t
|
|
||||||
4\t
|
|
||||||
8\t
|
|
||||||
'
|
|
||||||
|
|
||||||
# Completions:
|
# Completions:
|
||||||
|
|
||||||
complete -c $bat -l acknowledgements -d "Print acknowledgements" -n __fish_is_first_arg
|
complete -c {{PROJECT_EXECUTABLE}} -l color -xka "auto never always" -d "Specify when to use colored output (default: auto)" -n "not __fish_seen_subcommand_from cache"
|
||||||
|
|
||||||
complete -c $bat -l color -x -a "$color_opts" -d "When to use colored output" -n __bat_no_excl_args
|
complete -c {{PROJECT_EXECUTABLE}} -l config-dir -d "Display location of '{{PROJECT_EXECUTABLE}}' configuration directory" -n "not __fish_seen_subcommand_from cache"
|
||||||
|
|
||||||
complete -c $bat -l config-dir -f -d "Display location of configuration directory" -n __fish_is_first_arg
|
complete -c {{PROJECT_EXECUTABLE}} -l config-file -d "Display location of '{{PROJECT_EXECUTABLE}}' configuration file" -n "not __fish_seen_subcommand_from cache"
|
||||||
|
|
||||||
complete -c $bat -l config-file -f -d "Display location of configuration file" -n __fish_is_first_arg
|
complete -c {{PROJECT_EXECUTABLE}} -l decorations -xka "auto never always" -d "Specify when to use the decorations specified with '--style' (default: auto)" -n "not __fish_seen_subcommand_from cache"
|
||||||
|
|
||||||
complete -c $bat -l decorations -x -a "$decorations_opts" -d "When to use --style decorations" -n __bat_no_excl_args
|
complete -c {{PROJECT_EXECUTABLE}} -s h -l help -d "Print help message" -n "not __fish_seen_subcommand_from cache"
|
||||||
|
|
||||||
complete -c $bat -l diagnostic -d "Print diagnostic info for bug reports" -n __fish_is_first_arg
|
complete -c {{PROJECT_EXECUTABLE}} -s H -l highlight-line -x -d "<N> Highlight the N-th line with a different background color" -n "not __fish_seen_subcommand_from cache"
|
||||||
|
|
||||||
complete -c $bat -s d -l diff -d "Only show lines with Git changes" -n __bat_no_excl_args
|
complete -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"
|
||||||
|
|
||||||
complete -c $bat -l diff-context -x -d "Show N context lines around Git changes" -n "__fish_seen_argument -s d -l diff"
|
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)"
|
||||||
|
|
||||||
complete -c $bat -l file-name -x -d "Specify the display name" -n __bat_no_excl_args
|
complete -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"
|
||||||
|
|
||||||
complete -c $bat -s f -l force-colorization -d "Force color and decorations" -n __bat_no_excl_args
|
complete -c {{PROJECT_EXECUTABLE}} -l list-languages -d "Display list of supported languages for syntax highlighting" -n "not __fish_seen_subcommand_from cache"
|
||||||
|
|
||||||
complete -c $bat -s h -d "Print a concise overview" -n __fish_is_first_arg
|
complete -c {{PROJECT_EXECUTABLE}} -l list-themes -d "Display a list of supported themes for syntax highlighting" -n "not __fish_seen_subcommand_from cache"
|
||||||
|
|
||||||
complete -c $bat -l help -f -d "Print all help information" -n __fish_is_first_arg
|
complete -c {{PROJECT_EXECUTABLE}} -s m -l map-syntax -x -d "<from:to> Map a file extension or file name to an existing syntax" -n "not __fish_seen_subcommand_from cache"
|
||||||
|
|
||||||
complete -c $bat -s H -l highlight-line -x -d "Highlight line(s) N[:M]" -n __bat_no_excl_args
|
complete -c {{PROJECT_EXECUTABLE}} -s n -l number -d "Only show line numbers, no other decorations. Alias for '--style=numbers'" -n "not __fish_seen_subcommand_from cache"
|
||||||
|
|
||||||
complete -c $bat -l ignored-suffix -x -d "Ignore extension" -n __bat_no_excl_args
|
complete -c {{PROJECT_EXECUTABLE}} -l pager -x -d "<command> Specify which pager program to use (default: less)" -n "not __fish_seen_subcommand_from cache"
|
||||||
|
|
||||||
complete -c $bat -l italic-text -x -a "$italic_text_opts" -d "When to use italic text in the output" -n __bat_no_excl_args
|
complete -c {{PROJECT_EXECUTABLE}} -l paging -xka "auto never always" -d "Specify when to use the pager (default: auto)" -n "not __fish_seen_subcommand_from cache"
|
||||||
|
|
||||||
complete -c $bat -s l -l language -x -k -a "(__bat_complete_list_languages)" -d "Set the syntax highlighting language" -n __bat_no_excl_args
|
complete -c {{PROJECT_EXECUTABLE}} -s p -l plain -d "Only show plain style, no decorations. Alias for '--style=plain'" -n "not __fish_seen_subcommand_from cache"
|
||||||
|
|
||||||
complete -c $bat -s r -l line-range -x -d "Only print lines [M]:[N] (either optional)" -n __bat_no_excl_args
|
complete -c {{PROJECT_EXECUTABLE}} -s P -d "Disable paging. Alias for '--paging=never'" -n "not __fish_seen_subcommand_from cache"
|
||||||
|
|
||||||
complete -c $bat -l list-languages -f -d "List syntax highlighting languages" -n __fish_is_first_arg
|
complete -c {{PROJECT_EXECUTABLE}} -s A -l show-all -d "Show non-printable characters like space/tab/newline" -n "not __fish_seen_subcommand_from cache"
|
||||||
|
|
||||||
complete -c $bat -l list-themes -f -d "List syntax highlighting themes" -n __fish_is_first_arg
|
complete -c {{PROJECT_EXECUTABLE}} -l style -xka "auto full plain changes header 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"
|
||||||
|
|
||||||
complete -c $bat -s m -l map-syntax -x -a "(__bat_complete_map_syntax)" -d "Map <glob pattern>:<language syntax>" -n __bat_no_excl_args
|
complete -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"
|
||||||
|
|
||||||
complete -c $bat -s n -l number -d "Only show line numbers, no other decorations" -n __bat_no_excl_args
|
complete -c {{PROJECT_EXECUTABLE}} -l terminal-width -x -d "<width> Explicitly set terminal width; Prefix with '+' or '-' to offset (default width is auto determined)" -n "not __fish_seen_subcommand_from cache"
|
||||||
|
|
||||||
complete -c $bat -l pager -x -a "$pager_opts" -d "Which pager to use" -n __bat_no_excl_args
|
complete -c {{PROJECT_EXECUTABLE}} -l theme -xka "({{PROJECT_EXECUTABLE}} --list-themes | cat)" -d "Set the theme for syntax highlighting" -n "not __fish_seen_subcommand_from cache"
|
||||||
|
|
||||||
complete -c $bat -l paging -x -a "$paging_opts" -d "When to use the pager" -n __bat_no_excl_args
|
complete -c {{PROJECT_EXECUTABLE}} -s u -l unbuffered -d "POSIX-compliant unbuffered output. Option is ignored" -n "not __fish_seen_subcommand_from cache"
|
||||||
|
|
||||||
complete -c $bat -s p -l plain -d "Disable decorations" -n __bat_no_excl_args
|
complete -c {{PROJECT_EXECUTABLE}} -s V -l version -d "Show version information" -n "not __fish_seen_subcommand_from cache"
|
||||||
|
|
||||||
complete -c $bat -o pp -d "Disable decorations and paging" -n __bat_no_excl_args
|
complete -c {{PROJECT_EXECUTABLE}} -l wrap -xka "auto never character" -d "<mode> Specify the text-wrapping mode (default: auto)" -n "not __fish_seen_subcommand_from cache"
|
||||||
|
|
||||||
complete -c $bat -s P -d "Disable paging" -n __bat_no_excl_args
|
|
||||||
|
|
||||||
complete -c $bat -s A -l show-all -d "Show non-printable characters" -n __bat_no_excl_args
|
|
||||||
|
|
||||||
complete -c $bat -l style -x -k -a "(__fish_complete_list , __bat_style_opts)" -d "Specify which non-content elements to display" -n __bat_no_excl_args
|
|
||||||
|
|
||||||
complete -c $bat -l tabs -x -a "$tabs_opts" -d "Set tab width" -n __bat_no_excl_args
|
|
||||||
|
|
||||||
complete -c $bat -l terminal-width -x -d "Set terminal <width>, +<offset>, or -<offset>" -n __bat_no_excl_args
|
|
||||||
|
|
||||||
complete -c $bat -l theme -x -a "(command $bat --list-themes | command cat)" -d "Set the syntax highlighting theme" -n __bat_no_excl_args
|
|
||||||
|
|
||||||
complete -c $bat -s V -l version -f -d "Show version information" -n __fish_is_first_arg
|
|
||||||
|
|
||||||
complete -c $bat -l wrap -x -a "$wrap_opts" -d "Text-wrapping mode" -n __bat_no_excl_args
|
|
||||||
|
|
||||||
# Sub-command 'cache' completions
|
# Sub-command 'cache' completions
|
||||||
## Completion of the 'cache' command itself is removed for better UX
|
complete -c {{PROJECT_EXECUTABLE}} -a "cache" -d "Modify the syntax/language definition cache" -n "not __fish_seen_subcommand_from cache"
|
||||||
## See https://github.com/sharkdp/bat/issues/2085#issuecomment-1271646802
|
|
||||||
|
|
||||||
complete -c $bat -l build -f -d "Parse new definitions into cache" -n __bat_cache_no_excl
|
complete -c {{PROJECT_EXECUTABLE}} -l build -f -d "Parse syntaxes/language definitions into cache" -n "__fish_seen_subcommand_from cache"
|
||||||
|
|
||||||
complete -c $bat -l clear -f -d "Reset definitions to defaults" -n __bat_cache_no_excl
|
complete -c {{PROJECT_EXECUTABLE}} -l clear -f -d "Reset syntaxes/language definitions to default settings" -n "__fish_seen_subcommand_from cache"
|
||||||
|
|
||||||
complete -c $bat -l blank -f -d "Create new data instead of appending" -n "__bat_cache_subcommand; and not __fish_seen_argument -l clear"
|
|
||||||
|
|
||||||
complete -c $bat -l source -x -a "(__fish_complete_directories)" -d "Load syntaxes and themes from DIR" -n "__bat_cache_subcommand; and not __fish_seen_argument -l clear"
|
|
||||||
|
|
||||||
complete -c $bat -l target -x -a "(__fish_complete_directories)" -d "Store cache in DIR" -n __bat_cache_subcommand
|
|
||||||
|
|
||||||
complete -c $bat -l acknowledgements -d "Build acknowledgements.bin" -n __bat_cache_no_excl
|
|
||||||
|
|
||||||
complete -c $bat -s h -d "Print a concise overview of $bat-cache help" -n __bat_cache_no_excl
|
|
||||||
|
|
||||||
complete -c $bat -l help -f -d "Print all $bat-cache help" -n __bat_cache_no_excl
|
|
||||||
|
|
||||||
# vim:ft=fish
|
|
||||||
|
28
assets/completions/bat.zsh.in
vendored
28
assets/completions/bat.zsh.in
vendored
@@ -75,19 +75,25 @@ _{{PROJECT_EXECUTABLE}}_main() {
|
|||||||
;;
|
;;
|
||||||
|
|
||||||
style)
|
style)
|
||||||
_values -s , 'style' default auto full plain changes header header-filename header-filesize grid rule numbers snip
|
_values -s , 'style' auto full plain changes header grid rule numbers snip
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
case $words[2] in
|
# first positional argument
|
||||||
cache)
|
if (( ${#words} == 2 )); then
|
||||||
## Completion of the 'cache' command itself is removed for better UX
|
local -a subcommands
|
||||||
## See https://github.com/sharkdp/bat/issues/2085#issuecomment-1271646802
|
subcommands=('cache:Modify the syntax-definition and theme cache')
|
||||||
_{{PROJECT_EXECUTABLE}}_cache_subcommand
|
_describe subcommand subcommands
|
||||||
;;
|
_{{PROJECT_EXECUTABLE}}_main
|
||||||
|
else
|
||||||
|
case $words[2] in
|
||||||
|
cache)
|
||||||
|
_{{PROJECT_EXECUTABLE}}_cache_subcommand
|
||||||
|
;;
|
||||||
|
|
||||||
*)
|
*)
|
||||||
_{{PROJECT_EXECUTABLE}}_main
|
_{{PROJECT_EXECUTABLE}}_main
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
fi
|
||||||
|
17
assets/manual/bat.1.in
vendored
17
assets/manual/bat.1.in
vendored
@@ -25,23 +25,11 @@ either '--language value', '--language=value', '-l value' or '-lvalue'.
|
|||||||
Show non\-printable characters like space, tab or newline. Use '\-\-tabs' to
|
Show non\-printable characters like space, tab or newline. Use '\-\-tabs' to
|
||||||
control the width of the tab\-placeholders.
|
control the width of the tab\-placeholders.
|
||||||
.HP
|
.HP
|
||||||
\fB\-\-nonprintable\-notation\fR
|
|
||||||
.IP
|
|
||||||
Specify how to display non-printable characters when using \-\-show\-all.
|
|
||||||
|
|
||||||
Possible values:
|
|
||||||
.RS
|
|
||||||
.IP "caret"
|
|
||||||
Use character sequences like ^G, ^J, ^@, .. to identify non-printable characters
|
|
||||||
.IP "unicode"
|
|
||||||
Use special Unicode code points to identify non-printable characters
|
|
||||||
.RE
|
|
||||||
.HP
|
|
||||||
\fB\-p\fR, \fB\-\-plain\fR
|
\fB\-p\fR, \fB\-\-plain\fR
|
||||||
.IP
|
.IP
|
||||||
Only show plain style, no decorations. This is an alias for
|
Only show plain style, no decorations. This is an alias for
|
||||||
\&'\-\-style=plain'. When '\-p' is used twice ('\-pp'), it also disables
|
\&'\-\-style=plain'. When '\-p' is used twice ('\-pp'), it also disables
|
||||||
automatic paging (alias for '\-\-style=plain \fB\-\-paging\fR=\fI\,never\/\fR').
|
automatic paging (alias for '\-\-style=plain \fB\-\-pager\fR=\fI\,never\/\fR').
|
||||||
.HP
|
.HP
|
||||||
\fB\-l\fR, \fB\-\-language\fR <language>
|
\fB\-l\fR, \fB\-\-language\fR <language>
|
||||||
.IP
|
.IP
|
||||||
@@ -158,8 +146,7 @@ Configure which elements (line numbers, file headers, grid borders, Git modifica
|
|||||||
of components to display (e.g. 'numbers,changes,grid') or a pre\-defined style ('full').
|
of components to display (e.g. 'numbers,changes,grid') or a pre\-defined style ('full').
|
||||||
To set a default style, add the '\-\-style=".."' option to the configuration file or
|
To set a default style, add the '\-\-style=".."' option to the configuration file or
|
||||||
export the BAT_STYLE environment variable (e.g.: export BAT_STYLE=".."). Possible
|
export the BAT_STYLE environment variable (e.g.: export BAT_STYLE=".."). Possible
|
||||||
values: *default*, full, auto, plain, changes, header, header-filename, header-filesize, grid,
|
values: *full*, auto, plain, changes, header, grid, rule, numbers, snip.
|
||||||
rule, numbers, snip.
|
|
||||||
.HP
|
.HP
|
||||||
\fB\-r\fR, \fB\-\-line\-range\fR <N:M>...
|
\fB\-r\fR, \fB\-\-line\-range\fR <N:M>...
|
||||||
.IP
|
.IP
|
||||||
|
13
assets/patches/TodoTxt.sublime-syntax.patch
vendored
13
assets/patches/TodoTxt.sublime-syntax.patch
vendored
@@ -1,13 +0,0 @@
|
|||||||
diff --git syntaxes/02_Extra/TodoTxt/TodoTxt.sublime-syntax syntaxes/02_Extra/TodoTxt/TodoTxt.sublime-syntax
|
|
||||||
index 6c75dbb..0115978 100644
|
|
||||||
--- syntaxes/02_Extra/TodoTxt/TodoTxt.sublime-syntax
|
|
||||||
+++ syntaxes/02_Extra/TodoTxt/TodoTxt.sublime-syntax
|
|
||||||
@@ -68,7 +68,7 @@ contexts:
|
|
||||||
|
|
||||||
- match: (\s+[^\s:]+:[^\s:]+)+\s*$
|
|
||||||
comment: Custom attributes
|
|
||||||
- scope: variable.annotation.todotxt.attribute
|
|
||||||
+ scope: variable.other.todotxt.attribute
|
|
||||||
|
|
||||||
comments:
|
|
||||||
# Comments begin with a '//' and finish at the end of the line.
|
|
20
assets/patches/TwoDark.tmTheme.patch
vendored
20
assets/patches/TwoDark.tmTheme.patch
vendored
@@ -1,20 +0,0 @@
|
|||||||
diff --git themes/TwoDark/TwoDark.tmTheme themes/TwoDark/TwoDark.tmTheme
|
|
||||||
index 87fd358..56376d3 100644
|
|
||||||
--- themes/TwoDark/TwoDark.tmTheme
|
|
||||||
+++ themes/TwoDark/TwoDark.tmTheme
|
|
||||||
@@ -533,7 +533,7 @@
|
|
||||||
<key>name</key>
|
|
||||||
<string>Json key</string>
|
|
||||||
<key>scope</key>
|
|
||||||
- <string>source.json meta.structure.dictionary.json string.quoted.double.json</string>
|
|
||||||
+ <string>source.json meta.mapping.key.json string.quoted.double.json</string>
|
|
||||||
<key>settings</key>
|
|
||||||
<dict>
|
|
||||||
<key>foreground</key>
|
|
||||||
@@ -875,4 +875,4 @@
|
|
||||||
<key>comment</key>
|
|
||||||
<string>Work in progress</string>
|
|
||||||
</dict>
|
|
||||||
-</plist>
|
|
||||||
\ No newline at end of file
|
|
||||||
+</plist>
|
|
BIN
assets/syntaxes.bin
vendored
BIN
assets/syntaxes.bin
vendored
Binary file not shown.
1
assets/syntaxes/02_Extra/Ada
vendored
1
assets/syntaxes/02_Extra/Ada
vendored
Submodule assets/syntaxes/02_Extra/Ada deleted from e2b8fd5175
2
assets/syntaxes/02_Extra/CMake
vendored
2
assets/syntaxes/02_Extra/CMake
vendored
Submodule assets/syntaxes/02_Extra/CMake updated: eb40ede56c...ab6ef4ef9f
1
assets/syntaxes/02_Extra/Crontab
vendored
1
assets/syntaxes/02_Extra/Crontab
vendored
Submodule assets/syntaxes/02_Extra/Crontab deleted from 54f1fa7ff0
@@ -8,7 +8,6 @@ file_extensions:
|
|||||||
- .env.local
|
- .env.local
|
||||||
- .env.sample
|
- .env.sample
|
||||||
- .env.example
|
- .env.example
|
||||||
- .env.template
|
|
||||||
- .env.test
|
- .env.test
|
||||||
- .env.test.local
|
- .env.test.local
|
||||||
- .env.testing
|
- .env.testing
|
||||||
@@ -24,10 +23,6 @@ file_extensions:
|
|||||||
- .env.defaults
|
- .env.defaults
|
||||||
- .envrc
|
- .envrc
|
||||||
- .flaskenv
|
- .flaskenv
|
||||||
- env
|
|
||||||
- env.example
|
|
||||||
- env.sample
|
|
||||||
- env.template
|
|
||||||
scope: source.env
|
scope: source.env
|
||||||
contexts:
|
contexts:
|
||||||
main:
|
main:
|
||||||
|
2
assets/syntaxes/02_Extra/Fish
vendored
2
assets/syntaxes/02_Extra/Fish
vendored
Submodule assets/syntaxes/02_Extra/Fish updated: 98316d4332...2c254cc851
@@ -95,7 +95,7 @@ contexts:
|
|||||||
|
|
||||||
fstab_dump:
|
fstab_dump:
|
||||||
- include: comment
|
- include: comment
|
||||||
- match: '\s*[012]\s*'
|
- match: '\s*[01]\s*'
|
||||||
comment: dump field
|
comment: dump field
|
||||||
scope: constant.numeric
|
scope: constant.numeric
|
||||||
set: fstab_pass
|
set: fstab_pass
|
||||||
@@ -107,7 +107,7 @@ contexts:
|
|||||||
|
|
||||||
fstab_pass:
|
fstab_pass:
|
||||||
- include: comment
|
- include: comment
|
||||||
- match: '\s*[012]\s*'
|
- match: '\s*[01]\s*'
|
||||||
comment: pass field
|
comment: pass field
|
||||||
scope: constant.numeric
|
scope: constant.numeric
|
||||||
set: expected_eol
|
set: expected_eol
|
||||||
|
2
assets/syntaxes/02_Extra/HTML (Twig)
vendored
2
assets/syntaxes/02_Extra/HTML (Twig)
vendored
Submodule assets/syntaxes/02_Extra/HTML (Twig) updated: aedf955eba...77def406d7
7
assets/syntaxes/02_Extra/INI.sublime-syntax
vendored
7
assets/syntaxes/02_Extra/INI.sublime-syntax
vendored
@@ -5,8 +5,8 @@ name: INI
|
|||||||
file_extensions:
|
file_extensions:
|
||||||
- ini
|
- ini
|
||||||
- INI
|
- INI
|
||||||
- "inf"
|
- inf
|
||||||
- "INF"
|
- INF
|
||||||
- reg
|
- reg
|
||||||
- REG
|
- REG
|
||||||
- lng
|
- lng
|
||||||
@@ -16,9 +16,6 @@ file_extensions:
|
|||||||
- url
|
- url
|
||||||
- URL
|
- URL
|
||||||
- .editorconfig
|
- .editorconfig
|
||||||
- .coveragerc
|
|
||||||
- .pylintrc
|
|
||||||
- .gitlint
|
|
||||||
- .hgrc
|
- .hgrc
|
||||||
- hgrc
|
- hgrc
|
||||||
scope: source.ini
|
scope: source.ini
|
||||||
|
2
assets/syntaxes/02_Extra/Julia
vendored
2
assets/syntaxes/02_Extra/Julia
vendored
Submodule assets/syntaxes/02_Extra/Julia updated: 4fde0fdedd...1e55f3211b
2
assets/syntaxes/02_Extra/LiveScript
vendored
2
assets/syntaxes/02_Extra/LiveScript
vendored
Submodule assets/syntaxes/02_Extra/LiveScript updated: d82aeb737d...2575013851
37
assets/syntaxes/02_Extra/Manpage.sublime-syntax
vendored
37
assets/syntaxes/02_Extra/Manpage.sublime-syntax
vendored
@@ -53,16 +53,6 @@ contexts:
|
|||||||
embed: synopsis
|
embed: synopsis
|
||||||
escape: '(?={{section_heading}})'
|
escape: '(?={{section_heading}})'
|
||||||
|
|
||||||
- match: '^(?:COMMANDS)\b'
|
|
||||||
scope: markup.heading.commands.man
|
|
||||||
embed: commands-start
|
|
||||||
escape: '(?={{section_heading}})'
|
|
||||||
|
|
||||||
- match: '^(?:ENVIRONMENT\s+VARIABLES)'
|
|
||||||
scope: markup.heading.env.man
|
|
||||||
embed: environment-variables
|
|
||||||
escape: '(?={{section_heading}})'
|
|
||||||
|
|
||||||
- match: '{{section_heading}}'
|
- match: '{{section_heading}}'
|
||||||
scope: markup.heading.other.man
|
scope: markup.heading.other.man
|
||||||
embed: options # some man pages put command line options under the description heading
|
embed: options # some man pages put command line options under the description heading
|
||||||
@@ -85,7 +75,7 @@ contexts:
|
|||||||
|
|
||||||
options:
|
options:
|
||||||
# command-line options like --option=value, --some-flag, or -x
|
# command-line options like --option=value, --some-flag, or -x
|
||||||
- match: '^[ ]{7}(?=-|\+)'
|
- match: '^[ ]{7}(?=-)'
|
||||||
push: expect-command-line-option
|
push: expect-command-line-option
|
||||||
- match: '(?:[^a-zA-Z0-9_-]|^|\s){{command_line_option}}'
|
- match: '(?:[^a-zA-Z0-9_-]|^|\s){{command_line_option}}'
|
||||||
captures:
|
captures:
|
||||||
@@ -106,7 +96,7 @@ contexts:
|
|||||||
- include: env-var
|
- include: env-var
|
||||||
|
|
||||||
expect-command-line-option:
|
expect-command-line-option:
|
||||||
- match: '[A-Za-z0-9-\.\?:#\$\+]+'
|
- match: '[A-Za-z0-9-]+'
|
||||||
scope: entity.name.command-line-option.man
|
scope: entity.name.command-line-option.man
|
||||||
- match: '(\[)(=)'
|
- match: '(\[)(=)'
|
||||||
captures:
|
captures:
|
||||||
@@ -132,7 +122,7 @@ contexts:
|
|||||||
pop: true
|
pop: true
|
||||||
|
|
||||||
expect-parameter:
|
expect-parameter:
|
||||||
- match: '[A-Za-z0-9-_]+'
|
- match: '[A-Za-z0-9-]+'
|
||||||
scope: variable.parameter.man
|
scope: variable.parameter.man
|
||||||
- match: (?=\s+\|)
|
- match: (?=\s+\|)
|
||||||
pop: true
|
pop: true
|
||||||
@@ -145,10 +135,6 @@ contexts:
|
|||||||
scope: punctuation.section.brackets.end.man
|
scope: punctuation.section.brackets.end.man
|
||||||
pop: true
|
pop: true
|
||||||
- include: expect-parameter
|
- include: expect-parameter
|
||||||
- match: '<'
|
|
||||||
scope: punctuation.definition.generic.begin.man
|
|
||||||
- match: '>'
|
|
||||||
scope: punctuation.definition.generic.end.man
|
|
||||||
- match: '$|(?=[],]|{{command_line_option}})'
|
- match: '$|(?=[],]|{{command_line_option}})'
|
||||||
pop: true
|
pop: true
|
||||||
|
|
||||||
@@ -183,20 +169,3 @@ contexts:
|
|||||||
- match: \[
|
- match: \[
|
||||||
scope: punctuation.section.brackets.begin.man
|
scope: punctuation.section.brackets.begin.man
|
||||||
push: command-line-option-or-pipe
|
push: command-line-option-or-pipe
|
||||||
|
|
||||||
commands-start:
|
|
||||||
- match: (?=^[ ]{7}.*(?:[ ]<|[|]))
|
|
||||||
push: commands
|
|
||||||
|
|
||||||
commands:
|
|
||||||
- match: '^[ ]{7}([a-z_\-]+)(?=[ ]|$)'
|
|
||||||
captures:
|
|
||||||
1: entity.name.command.man
|
|
||||||
push: expect-parameter
|
|
||||||
- match: '^[ ]{7}(?=[\[<]|\w+[|\]])'
|
|
||||||
push: expect-parameter
|
|
||||||
|
|
||||||
environment-variables:
|
|
||||||
- match: '^[ ]{7}([A-Z_]+)\b'
|
|
||||||
captures:
|
|
||||||
1: support.constant.environment-variable.man
|
|
||||||
|
2
assets/syntaxes/02_Extra/MediaWiki
vendored
2
assets/syntaxes/02_Extra/MediaWiki
vendored
Submodule assets/syntaxes/02_Extra/MediaWiki updated: 5dceaa9dd9...81bf97cace
2
assets/syntaxes/02_Extra/Nginx
vendored
2
assets/syntaxes/02_Extra/Nginx
vendored
Submodule assets/syntaxes/02_Extra/Nginx updated: 65f5a63c0d...15a1db1510
2
assets/syntaxes/02_Extra/PowerShell
vendored
2
assets/syntaxes/02_Extra/PowerShell
vendored
Submodule assets/syntaxes/02_Extra/PowerShell updated: c0372a1d2d...742f0b5d4b
@@ -1,120 +0,0 @@
|
|||||||
%YAML 1.2
|
|
||||||
---
|
|
||||||
# http://www.sublimetext.com/docs/syntax.html
|
|
||||||
name: Requirements.txt
|
|
||||||
scope: source.requirements-txt
|
|
||||||
# https://pip.pypa.io/en/stable/reference/requirements-file-format/
|
|
||||||
# https://github.com/raimon49/requirements.txt.vim/blob/f246bd10155fbc3b1a9e2fff6c95b21521b09116/ftdetect/requirements.vim
|
|
||||||
file_extensions:
|
|
||||||
- requirements.txt
|
|
||||||
- requirements.in
|
|
||||||
- pip
|
|
||||||
# https://github.com/sublimehq/Packages/pull/2760/files
|
|
||||||
first_line_match: |-
|
|
||||||
(?xi:
|
|
||||||
^ \#! .* \bpip # shebang
|
|
||||||
| ^ \s* \# .*? -\*- .*? \bpip-requirements\b .*? -\*- # editorconfig
|
|
||||||
| ^ \s* \# (vim?|ex): .*? \brequirements\b # modeline
|
|
||||||
)
|
|
||||||
# pip install -r
|
|
||||||
# pip-compile
|
|
||||||
|
|
||||||
variables:
|
|
||||||
operator: '===?|<=?|>=?|~=|!='
|
|
||||||
|
|
||||||
contexts:
|
|
||||||
main:
|
|
||||||
- match: '(?i)\d+[\da-z\-_\.\*]*'
|
|
||||||
scope: constant.other.version-control.requirements-txt
|
|
||||||
- match: '(?i)^\[?--?[\da-z\-]*\]?'
|
|
||||||
scope: entity.name.function.option.requirements-txt
|
|
||||||
- match: '{{operator}}'
|
|
||||||
scope: keyword.operator.logical.requirements-txt
|
|
||||||
- match: '(\[)'
|
|
||||||
captures:
|
|
||||||
1: punctuation.section.braces.begin.requirements-txt
|
|
||||||
push:
|
|
||||||
- meta_scope: variable.function.extra.requirements-txt
|
|
||||||
- match: ','
|
|
||||||
scope: punctuation.separator.requirements-txt
|
|
||||||
- match: '(\])'
|
|
||||||
captures:
|
|
||||||
1: punctuation.section.braces.end.requirements-txt
|
|
||||||
pop: true
|
|
||||||
- match: '(git\+?|hg\+|svn\+|bzr\+).*://.\S+'
|
|
||||||
scope: markup.underline.link.versioncontrols.requirements-txt
|
|
||||||
- match: '(@\s)?(https?|ftp|gopher)://?[^\s/$.?#].\S*'
|
|
||||||
scope: markup.underline.link.url.requirements-txt
|
|
||||||
captures:
|
|
||||||
1: punctuation.definition.keyword.requirements-txt
|
|
||||||
- match: '(?i)^[a-z\d_\-\.]*[a-z\d]'
|
|
||||||
scope: variable.parameter.package-name.requirements-txt
|
|
||||||
- match: '(;)'
|
|
||||||
captures:
|
|
||||||
1: punctuation.definition.annotation.requirements-txt
|
|
||||||
push:
|
|
||||||
- meta_scope: meta.annotation.requirements-txt
|
|
||||||
# https://pip.pypa.io/en/stable/reference/inspect-report/#example
|
|
||||||
- match: |-
|
|
||||||
(?x:
|
|
||||||
implementation_name
|
|
||||||
| implementation_version
|
|
||||||
| os_name
|
|
||||||
| platform_machine
|
|
||||||
| platform_release
|
|
||||||
| platform_system
|
|
||||||
| platform_version
|
|
||||||
| python_full_version
|
|
||||||
| platform_python_implementation
|
|
||||||
| python_version
|
|
||||||
| sys_platform
|
|
||||||
)
|
|
||||||
scope: variable.language.requirements-txt
|
|
||||||
- match: '{{operator}}'
|
|
||||||
scope: keyword.operator.logical.requirements-txt
|
|
||||||
# https://pip.pypa.io/en/stable/reference/requirement-specifiers/#examples
|
|
||||||
- match: '(")'
|
|
||||||
captures:
|
|
||||||
1: punctuation.definition.string.begin.double.requirements-txt
|
|
||||||
push:
|
|
||||||
- meta_scope: string.quoted.double.requirements-txt
|
|
||||||
- match: '\\"'
|
|
||||||
scope: constant.character.escape.double.requirements-txt
|
|
||||||
- match: '(")'
|
|
||||||
captures:
|
|
||||||
1: punctuation.definition.string.end.double.requirements-txt
|
|
||||||
pop: true
|
|
||||||
- match: "(')"
|
|
||||||
captures:
|
|
||||||
1: punctuation.definition.string.begin.single.requirements-txt
|
|
||||||
push:
|
|
||||||
- meta_scope: string.quoted.single.requirements-txt
|
|
||||||
- match: '\\'''
|
|
||||||
scope: constant.character.escape.single.requirements-txt
|
|
||||||
- match: "(')"
|
|
||||||
captures:
|
|
||||||
1: punctuation.definition.string.end.single.requirements-txt
|
|
||||||
pop: true
|
|
||||||
- match: '(.(?=#)|$)'
|
|
||||||
pop: true
|
|
||||||
- match: '(\$)(\{)'
|
|
||||||
captures:
|
|
||||||
1: punctuation.definition.keyword.requirements-txt
|
|
||||||
2: punctuation.definition.begin.parameter.requirements-txt
|
|
||||||
push:
|
|
||||||
- meta_scope: variable.parameter.requirements-txt
|
|
||||||
- match: '(\})'
|
|
||||||
captures:
|
|
||||||
1: punctuation.definition.end.parameter.requirements-txt
|
|
||||||
pop: true
|
|
||||||
- match: '(#)'
|
|
||||||
captures:
|
|
||||||
1: punctuation.definition.comment.requirements-txt
|
|
||||||
push:
|
|
||||||
- meta_scope: comment.line.requirements-txt
|
|
||||||
- match: '(-*-) coding: .* (-*-)'
|
|
||||||
captures:
|
|
||||||
1: punctuation.definition.begin.pep263.requirements-txt
|
|
||||||
2: punctuation.definition.end.pep263.requirements-txt
|
|
||||||
- match: '$'
|
|
||||||
pop: true
|
|
1
assets/syntaxes/02_Extra/SublimeJQ
vendored
1
assets/syntaxes/02_Extra/SublimeJQ
vendored
Submodule assets/syntaxes/02_Extra/SublimeJQ deleted from 687058289c
2
assets/syntaxes/02_Extra/TOML
vendored
2
assets/syntaxes/02_Extra/TOML
vendored
Submodule assets/syntaxes/02_Extra/TOML updated: fd0bf3e5d6...ed38438900
1
assets/syntaxes/02_Extra/TodoTxt
vendored
1
assets/syntaxes/02_Extra/TodoTxt
vendored
Submodule assets/syntaxes/02_Extra/TodoTxt deleted from 071a004217
@@ -4,8 +4,6 @@
|
|||||||
name: TypeScript
|
name: TypeScript
|
||||||
file_extensions:
|
file_extensions:
|
||||||
- ts
|
- ts
|
||||||
- mts
|
|
||||||
- cts
|
|
||||||
scope: source.ts
|
scope: source.ts
|
||||||
contexts:
|
contexts:
|
||||||
main:
|
main:
|
||||||
|
104
assets/syntaxes/02_Extra/VimHelp.sublime-syntax
vendored
104
assets/syntaxes/02_Extra/VimHelp.sublime-syntax
vendored
@@ -1,104 +0,0 @@
|
|||||||
%YAML 1.2
|
|
||||||
---
|
|
||||||
# http://www.sublimetext.com/docs/syntax.html
|
|
||||||
scope: source.vimhelp
|
|
||||||
file_extensions:
|
|
||||||
# shortname
|
|
||||||
- vimhelp
|
|
||||||
|
|
||||||
# $VIMRUNTIME/syntax/help.vim
|
|
||||||
contexts:
|
|
||||||
main:
|
|
||||||
- match: '(?<=^\s*)(vim?|ex):\s*([a-z]+(=[^\s:]+)?(\s+|:))+'
|
|
||||||
scope: comment.line.modeline.vimhelp
|
|
||||||
- match: '^[-A-Z .][-A-Z0-9 .()_]*(?=\s+\*|$)'
|
|
||||||
scope: markup.heading.headline.vimhelp
|
|
||||||
- match: '^(===.*===)$'
|
|
||||||
captures:
|
|
||||||
1: punctuation.definition.heading.1.setext.vimhelp
|
|
||||||
push:
|
|
||||||
- meta_scope: markup.heading.1.setext.vimhelp
|
|
||||||
- match: '\t| '
|
|
||||||
pop: true
|
|
||||||
- match: '^(---.*---)$'
|
|
||||||
captures:
|
|
||||||
1: punctuation.definition.heading.2.setext.vimhelp
|
|
||||||
push:
|
|
||||||
- meta_scope: markup.heading.2.setext.vimhelp
|
|
||||||
- match: '\t| '
|
|
||||||
pop: true
|
|
||||||
- match: '(?:^| )(>)$'
|
|
||||||
captures:
|
|
||||||
1: punctuation.definition.blockquote.begin.vimhelp
|
|
||||||
push:
|
|
||||||
- meta_scope: markup.quote.vimhelp
|
|
||||||
- match: '^(<)'
|
|
||||||
captures:
|
|
||||||
1: punctuation.definition.blockquote.end.vimhelp
|
|
||||||
pop: true
|
|
||||||
- match: '^(?=\S)'
|
|
||||||
pop: true
|
|
||||||
- match: '(?<!\\)(\|)([#-)!+-~]+)(\|)'
|
|
||||||
captures:
|
|
||||||
1: punctuation.definition.link.begin.vimhelp
|
|
||||||
2: markup.underline.link.vimhelp
|
|
||||||
3: punctuation.definition.link.end.vimhelp
|
|
||||||
- match: '(\*)([#-)!+-~]+)(\*)(?:\s|$)'
|
|
||||||
captures:
|
|
||||||
1: punctuation.definition.constant.begin.vimhelp
|
|
||||||
2: entity.name.reference.link.vimhelp
|
|
||||||
3: punctuation.definition.constant.end.vimhelp
|
|
||||||
- match: '\bVim version [0-9][0-9.a-z]*'
|
|
||||||
scope: variable.language.vimhelp
|
|
||||||
- match: 'N?VIM REFERENCE.*'
|
|
||||||
scope: variable.language.vimhelp
|
|
||||||
- match: '('')([a-z]{2,}|t_..)('')'
|
|
||||||
captures:
|
|
||||||
1: punctuation.definition.link.option.begin.vimhelp
|
|
||||||
2: markup.underline.link.option.vimhelp
|
|
||||||
3: punctuation.definition.link.option.end.vimhelp
|
|
||||||
- match: '(`)([^` \t]+)(`)'
|
|
||||||
captures:
|
|
||||||
1: punctuation.definition.link.command.begin.vimhelp
|
|
||||||
2: markup.underline.link.command.vimhelp
|
|
||||||
3: punctuation.definition.link.command.end.vimhelp
|
|
||||||
- match: '(?<=^|[^a-z"\[])(`)([^`]+)(`)(?=[^a-z\t."'']|$)'
|
|
||||||
captures:
|
|
||||||
1: punctuation.definition.link.command.begin.vimhelp
|
|
||||||
2: markup.underline.link.command.vimhelp
|
|
||||||
3: punctuation.definition.link.command.end.vimhelp
|
|
||||||
- match: '(?<=\s*)(.*?)(?=\s?)(~)$'
|
|
||||||
captures:
|
|
||||||
1: markup.heading.header.vimhelp
|
|
||||||
2: punctuation.definition.keyword.vimhelp
|
|
||||||
- match: '(.*) (?=`$)'
|
|
||||||
captures:
|
|
||||||
1: variable.other.graphic.vimhelp
|
|
||||||
2: punctuation.definition.keyword.vimhelp
|
|
||||||
- match: '\b(note:?|Note:?|NOTE:?|Notes:?)\b'
|
|
||||||
scope: constant.other.note.vimhelp
|
|
||||||
- match: '\b(WARNING:?|Warning:)\b'
|
|
||||||
scope: constant.other.warning.vimhelp
|
|
||||||
- match: '\b(DEPRECATED:?|Deprecated:)\b'
|
|
||||||
scope: constant.other.deprecated.vimhelp
|
|
||||||
- match: '(\{)([-_a-zA-Z0-9''"*+/:%#=\[\]<>.,]+)(\})'
|
|
||||||
captures:
|
|
||||||
1: punctuation.definition.constant.begin.vimhelp
|
|
||||||
2: constant.numeric.vimhelp
|
|
||||||
3: punctuation.definition.constant.end.vimhelp
|
|
||||||
- match: '\[(range|line|count|offset|\+?cmd|(\+|-|)num|\+\+opt)\]'
|
|
||||||
scope: constant.numeric.vimhelp
|
|
||||||
- match: '\[(arg(uments)?|ident|addr|group)\]'
|
|
||||||
scope: constant.numeric.vimhelp
|
|
||||||
- match: '\[(readonly|fifo|socket|converted|crypted)\]'
|
|
||||||
scope: constant.numeric.vimhelp
|
|
||||||
- match: '<[-a-zA-Z0-9_]+>'
|
|
||||||
scope: markup.underline.link.key.vimhelp
|
|
||||||
- match: '<[SCM]-.>'
|
|
||||||
scope: markup.underline.link.key.vimhelp
|
|
||||||
- match: 'CTRL-((SHIFT-)?.|Break|PageUp|PageDown|Insert|Del|\{char\})'
|
|
||||||
scope: markup.underline.link.key.vimhelp
|
|
||||||
- match: '(META|ALT)-.'
|
|
||||||
scope: markup.underline.link.key.vimhelp
|
|
||||||
- match: '\b(((https?|ftp|gopher)://|(mailto|file|news):)[^'' <>"]+|(www|web|w3)[a-z0-9_-]*\.[a-z0-9._-]+\.[^'' <>"]+)[a-zA-Z0-9/]'
|
|
||||||
scope: markup.underline.link.url.vimhelp
|
|
2
assets/syntaxes/02_Extra/Zig
vendored
2
assets/syntaxes/02_Extra/Zig
vendored
Submodule assets/syntaxes/02_Extra/Zig updated: 1a4a38445f...87ecbcae6f
1
assets/syntaxes/02_Extra/cmd-help
vendored
1
assets/syntaxes/02_Extra/cmd-help
vendored
Submodule assets/syntaxes/02_Extra/cmd-help deleted from f41e5fc838
98
assets/syntaxes/02_Extra/log.sublime-syntax
vendored
98
assets/syntaxes/02_Extra/log.sublime-syntax
vendored
@@ -6,16 +6,8 @@ file_extensions:
|
|||||||
scope: text.log
|
scope: text.log
|
||||||
variables:
|
variables:
|
||||||
ipv4_part: (?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)
|
ipv4_part: (?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)
|
||||||
hours_minutes_seconds: (?:[01]\d|2[0-3]):(?:[0-5]\d):(?:[0-5]\d)
|
|
||||||
error: \b(?i:fail(?:ure|ed)?|error|exception|fatal|critical)\b
|
|
||||||
warning: \b(?i:warn(?:ing)?)\b
|
|
||||||
info: \b(?i:info)\b
|
|
||||||
debug: \b(?i:debug)\b
|
|
||||||
contexts:
|
contexts:
|
||||||
main:
|
main:
|
||||||
- include: log_level_lines
|
|
||||||
- include: main_without_log_level_line
|
|
||||||
main_without_log_level_line:
|
|
||||||
- match: (\w+)(=)
|
- match: (\w+)(=)
|
||||||
captures:
|
captures:
|
||||||
1: variable.parameter.log
|
1: variable.parameter.log
|
||||||
@@ -25,85 +17,31 @@ contexts:
|
|||||||
captures:
|
captures:
|
||||||
1: punctuation.definition.string.begin.log
|
1: punctuation.definition.string.begin.log
|
||||||
3: punctuation.definition.string.end.log
|
3: punctuation.definition.string.end.log
|
||||||
- match: \"
|
- match: (")([^"]*)(")
|
||||||
|
scope: string.quoted.double.log
|
||||||
captures:
|
captures:
|
||||||
1: punctuation.definition.string.begin.log
|
1: punctuation.definition.string.begin.log
|
||||||
push: double_quoted_string
|
3: punctuation.definition.string.end.log
|
||||||
- include: dates
|
- include: dates
|
||||||
- include: ip_addresses
|
- include: ip_addresses
|
||||||
- include: numbers
|
- include: numbers
|
||||||
- include: log_levels
|
- match: \b(?i:fail(?:ure|ed)?|error|exception)\b
|
||||||
|
scope: markup.error.log
|
||||||
|
- match: \b(?i:warn(?:ing)?)\b
|
||||||
|
scope: markup.warning.log
|
||||||
#- include: scope:text.html.markdown#autolink-inet
|
#- include: scope:text.html.markdown#autolink-inet
|
||||||
- match: \b\w+:/{2,3}
|
- match: \b\w+:/{2,3}
|
||||||
scope: markup.underline.link.scheme.log
|
scope: markup.underline.link.scheme.log
|
||||||
push: url-host
|
push: url-host
|
||||||
log_level_lines:
|
|
||||||
- match: ^(?=.*{{error}})
|
|
||||||
push:
|
|
||||||
- error_line
|
|
||||||
- main_pop_at_eol
|
|
||||||
- match: ^(?=.*{{warning}})
|
|
||||||
push:
|
|
||||||
- warning_line
|
|
||||||
- main_pop_at_eol
|
|
||||||
- match: ^(?=.*{{info}})
|
|
||||||
push:
|
|
||||||
- info_line
|
|
||||||
- main_pop_at_eol
|
|
||||||
- match: ^(?=.*{{debug}})
|
|
||||||
push:
|
|
||||||
- debug_line
|
|
||||||
- main_pop_at_eol
|
|
||||||
log_levels:
|
|
||||||
- match: '{{error}}'
|
|
||||||
scope: markup.error.log
|
|
||||||
- match: '{{warning}}'
|
|
||||||
scope: markup.warning.log
|
|
||||||
- match: '{{info}}'
|
|
||||||
scope: markup.info.log
|
|
||||||
- match: '{{debug}}'
|
|
||||||
scope: markup.info.log
|
|
||||||
error_line:
|
|
||||||
- meta_scope: meta.annotation.error-line.log
|
|
||||||
- include: immediately_pop
|
|
||||||
warning_line:
|
|
||||||
- meta_scope: meta.annotation.warning-line.log
|
|
||||||
- include: immediately_pop
|
|
||||||
info_line:
|
|
||||||
- meta_scope: meta.annotation.info-line.log
|
|
||||||
- include: immediately_pop
|
|
||||||
debug_line:
|
|
||||||
- meta_scope: meta.annotation.debug-line.log
|
|
||||||
- include: immediately_pop
|
|
||||||
immediately_pop:
|
|
||||||
- match: ''
|
|
||||||
pop: true
|
|
||||||
pop_at_eol:
|
|
||||||
- match: $
|
|
||||||
pop: true
|
|
||||||
main_pop_at_eol:
|
|
||||||
- include: main_without_log_level_line
|
|
||||||
- include: pop_at_eol
|
|
||||||
dates:
|
dates:
|
||||||
- match: \b\d{4}-\d{2}-\d{2}(?=\b|T)
|
- match: \b\d{4}-\d{2}-\d{2}\b
|
||||||
scope: meta.date.log meta.number.integer.decimal.log constant.numeric.value.log
|
scope: meta.date.log meta.number.integer.decimal.log constant.numeric.value.log
|
||||||
push: maybe_date_time_separator
|
- match: \b\d{4}/\d{2}/\d{2}\b
|
||||||
- match: \b\d{4}/\d{2}/\d{2}(?=\b|T)
|
|
||||||
scope: meta.date.log meta.number.integer.decimal.log constant.numeric.value.log
|
scope: meta.date.log meta.number.integer.decimal.log constant.numeric.value.log
|
||||||
push: maybe_date_time_separator
|
- match: \b(?:[01]\d|2[0-3]):(?:[0-5]\d):(?:[0-5]\d)(?:(\.)\d{3})?\b
|
||||||
- match: \b(?={{hours_minutes_seconds}})
|
|
||||||
push: time
|
|
||||||
time:
|
|
||||||
- match: (?:{{hours_minutes_seconds}})(?:(\.)\d{3})?\b
|
|
||||||
scope: meta.time.log meta.number.integer.decimal.log constant.numeric.value.log
|
scope: meta.time.log meta.number.integer.decimal.log constant.numeric.value.log
|
||||||
captures:
|
captures:
|
||||||
1: punctuation.separator.decimal.log
|
1: punctuation.separator.decimal.log
|
||||||
- include: immediately_pop
|
|
||||||
maybe_date_time_separator:
|
|
||||||
- match: T(?={{hours_minutes_seconds}})
|
|
||||||
scope: meta.date.log meta.time.log keyword.other.log
|
|
||||||
set: time
|
|
||||||
- include: immediately_pop
|
|
||||||
ip_addresses:
|
ip_addresses:
|
||||||
- match: \b(?=(?:{{ipv4_part}}\.){3}{{ipv4_part}}\b)
|
- match: \b(?=(?:{{ipv4_part}}\.){3}{{ipv4_part}}\b)
|
||||||
push:
|
push:
|
||||||
@@ -112,7 +50,8 @@ contexts:
|
|||||||
scope: constant.numeric.value.log
|
scope: constant.numeric.value.log
|
||||||
- match: \.
|
- match: \.
|
||||||
scope: punctuation.separator.sequence.log
|
scope: punctuation.separator.sequence.log
|
||||||
- include: immediately_pop
|
- match: ''
|
||||||
|
pop: true
|
||||||
- match: (?=(?:\h{0,4}:){2,6}\h{1,4}\b)
|
- match: (?=(?:\h{0,4}:){2,6}\h{1,4}\b)
|
||||||
push:
|
push:
|
||||||
- meta_scope: meta.ipaddress.v6.log meta.number.integer.hexadecimal.log
|
- meta_scope: meta.ipaddress.v6.log meta.number.integer.hexadecimal.log
|
||||||
@@ -120,7 +59,8 @@ contexts:
|
|||||||
scope: constant.numeric.value.log
|
scope: constant.numeric.value.log
|
||||||
- match: ':'
|
- match: ':'
|
||||||
scope: punctuation.separator.sequence.log
|
scope: punctuation.separator.sequence.log
|
||||||
- include: immediately_pop
|
- match: ''
|
||||||
|
pop: true
|
||||||
numbers:
|
numbers:
|
||||||
- match: \b(0x)(\h+)(?:(\.)(\h+))?\b
|
- match: \b(0x)(\h+)(?:(\.)(\h+))?\b
|
||||||
scope: meta.number.float.hexadecimal.log
|
scope: meta.number.float.hexadecimal.log
|
||||||
@@ -172,13 +112,5 @@ contexts:
|
|||||||
pop: true
|
pop: true
|
||||||
- match: '[^?!.,:*_~\s<&()%]+|\S'
|
- match: '[^?!.,:*_~\s<&()%]+|\S'
|
||||||
scope: markup.underline.link.path.log
|
scope: markup.underline.link.path.log
|
||||||
- include: immediately_pop
|
- match: ''
|
||||||
double_quoted_string:
|
|
||||||
- meta_scope: string.quoted.double.log
|
|
||||||
- match: \\"
|
|
||||||
scope: constant.character.escape.log
|
|
||||||
- match: \\n
|
|
||||||
scope: constant.character.escape.log
|
|
||||||
- match: \"
|
|
||||||
scope: punctuation.definition.string.end.log
|
|
||||||
pop: true
|
pop: true
|
||||||
|
419
assets/syntaxes/02_Extra/syntax_test_helphelp.txt
vendored
419
assets/syntaxes/02_Extra/syntax_test_helphelp.txt
vendored
@@ -1,419 +0,0 @@
|
|||||||
# SYNTAX TEST "VimHelp.sublime-syntax"
|
|
||||||
*helphelp.txt* Nvim
|
|
||||||
# <- punctuation.definition.constant.begin
|
|
||||||
#^^^^^^^^^^^^ entity.name.reference.link
|
|
||||||
# ^ punctuation.definition.constant.end
|
|
||||||
|
|
||||||
|
|
||||||
VIM REFERENCE MANUAL by Bram Moolenaar
|
|
||||||
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ variable.language
|
|
||||||
|
|
||||||
|
|
||||||
Help on help files *helphelp*
|
|
||||||
|
|
||||||
Type |gO| to see the table of contents.
|
|
||||||
# ^ punctuation.definition.link.begin
|
|
||||||
# ^^ markup.underline.link
|
|
||||||
# ^ punctuation.definition.link.end
|
|
||||||
|
|
||||||
==============================================================================
|
|
||||||
#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ punctuation.definition.heading.1.setext
|
|
||||||
1. Help commands *online-help*
|
|
||||||
#^^^^^^^^^^^^^^^ markup.heading.1.setext
|
|
||||||
|
|
||||||
*help* *<Help>* *:h* *:help* *<F1>* *i_<F1>* *i_<Help>*
|
|
||||||
<Help> or
|
|
||||||
#^^^^^ markup.underline.link.key
|
|
||||||
:h[elp] Open a window and display the help file in read-only
|
|
||||||
mode. If there is a help window open already, use
|
|
||||||
that one. Otherwise, if the current window uses the
|
|
||||||
full width of the screen or is at least 80 characters
|
|
||||||
wide, the help window will appear just above the
|
|
||||||
current window. Otherwise the new window is put at
|
|
||||||
the very top.
|
|
||||||
The 'helplang' option is used to select a language, if
|
|
||||||
# ^ punctuation.definition.link.option.begin
|
|
||||||
# ^^^^^^^^ markup.underline.link.option
|
|
||||||
# ^ punctuation.definition.link.option.end
|
|
||||||
the main help file is available in several languages.
|
|
||||||
|
|
||||||
Type |gO| to see the table of contents.
|
|
||||||
|
|
||||||
*{subject}* *E149* *E661*
|
|
||||||
:h[elp] {subject} Like ":help", additionally jump to the tag {subject}.
|
|
||||||
For example: >
|
|
||||||
:help options
|
|
||||||
|
|
||||||
< {subject} can include wildcards such as "*", "?" and
|
|
||||||
# ^ punctuation.definition.constant.begin
|
|
||||||
# ^^^^^^^ constant.numeric
|
|
||||||
# ^ punctuation.definition.constant.end
|
|
||||||
"[a-z]":
|
|
||||||
:help z? jump to help for any "z" command
|
|
||||||
:help z. jump to the help for "z."
|
|
||||||
But when a tag exists it is taken literally:
|
|
||||||
:help :? jump to help for ":?"
|
|
||||||
|
|
||||||
If there is no full match for the pattern, or there
|
|
||||||
are several matches, the "best" match will be used.
|
|
||||||
A sophisticated algorithm is used to decide which
|
|
||||||
match is better than another one. These items are
|
|
||||||
considered in the computation:
|
|
||||||
- A match with same case is much better than a match
|
|
||||||
with different case.
|
|
||||||
- A match that starts after a non-alphanumeric
|
|
||||||
character is better than a match in the middle of a
|
|
||||||
word.
|
|
||||||
- A match at or near the beginning of the tag is
|
|
||||||
better than a match further on.
|
|
||||||
- The more alphanumeric characters match, the better.
|
|
||||||
- The shorter the length of the match, the better.
|
|
||||||
|
|
||||||
The 'helplang' option is used to select a language, if
|
|
||||||
the {subject} is available in several languages.
|
|
||||||
To find a tag in a specific language, append "@ab",
|
|
||||||
where "ab" is the two-letter language code. See
|
|
||||||
|help-translated|.
|
|
||||||
|
|
||||||
Note that the longer the {subject} you give, the less
|
|
||||||
matches will be found. You can get an idea how this
|
|
||||||
all works by using commandline completion (type CTRL-D
|
|
||||||
# ^^^^^^ markup.underline.link.key
|
|
||||||
after ":help subject" |c_CTRL-D|).
|
|
||||||
If there are several matches, you can have them listed
|
|
||||||
by hitting CTRL-D. Example: >
|
|
||||||
:help cont<Ctrl-D>
|
|
||||||
|
|
||||||
< Instead of typing ":help CTRL-V" to search for help
|
|
||||||
for CTRL-V you can type: >
|
|
||||||
:help ^V
|
|
||||||
< This also works together with other characters, for
|
|
||||||
example to find help for CTRL-V in Insert mode: >
|
|
||||||
:help i^V
|
|
||||||
<
|
|
||||||
It is also possible to first do ":help" and then
|
|
||||||
use ":tag {pattern}" in the help window. The
|
|
||||||
":tnext" command can then be used to jump to other
|
|
||||||
matches, "tselect" to list matches and choose one. >
|
|
||||||
:help index
|
|
||||||
:tselect /.*mode
|
|
||||||
|
|
||||||
< When there is no argument you will see matches for
|
|
||||||
"help", to avoid listing all possible matches (that
|
|
||||||
would be very slow).
|
|
||||||
The number of matches displayed is limited to 300.
|
|
||||||
|
|
||||||
The `:help` command can be followed by '|' and another
|
|
||||||
command, but you don't need to escape the '|' inside a
|
|
||||||
help command. So these both work: >
|
|
||||||
:help |
|
|
||||||
:help k| only
|
|
||||||
< Note that a space before the '|' is seen as part of
|
|
||||||
# ^^^^ constant.other.note
|
|
||||||
the ":help" argument.
|
|
||||||
You can also use <NL> or <CR> to separate the help
|
|
||||||
command from a following command. You need to type
|
|
||||||
CTRL-V first to insert the <NL> or <CR>. Example: >
|
|
||||||
:help so<C-V><CR>only
|
|
||||||
<
|
|
||||||
|
|
||||||
:h[elp]! [subject] Like ":help", but in non-English help files prefer to
|
|
||||||
find a tag in a file with the same language as the
|
|
||||||
current file. See |help-translated|.
|
|
||||||
|
|
||||||
*:helpc* *:helpclose*
|
|
||||||
:helpc[lose] Close one help window, if there is one.
|
|
||||||
Vim will try to restore the window layout (including
|
|
||||||
cursor position) to the same layout it was before
|
|
||||||
opening the help window initially. This might cause
|
|
||||||
triggering several autocommands.
|
|
||||||
|
|
||||||
*:helpg* *:helpgrep*
|
|
||||||
:helpg[rep] {pattern}[@xx]
|
|
||||||
Search all help text files and make a list of lines
|
|
||||||
in which {pattern} matches. Jumps to the first match.
|
|
||||||
The optional [@xx] specifies that only matches in the
|
|
||||||
"xx" language are to be found.
|
|
||||||
You can navigate through the matches with the
|
|
||||||
|quickfix| commands, e.g., |:cnext| to jump to the
|
|
||||||
next one. Or use |:cwindow| to get the list of
|
|
||||||
matches in the quickfix window.
|
|
||||||
{pattern} is used as a Vim regexp |pattern|.
|
|
||||||
'ignorecase' is not used, add "\c" to ignore case.
|
|
||||||
Example for case sensitive search: >
|
|
||||||
:helpgrep Uganda
|
|
||||||
< Example for case ignoring search: >
|
|
||||||
:helpgrep uganda\c
|
|
||||||
< Example for searching in French help: >
|
|
||||||
:helpgrep backspace@fr
|
|
||||||
< The pattern does not support line breaks, it must
|
|
||||||
match within one line. You can use |:grep| instead,
|
|
||||||
but then you need to get the list of help files in a
|
|
||||||
complicated way.
|
|
||||||
Cannot be followed by another command, everything is
|
|
||||||
used as part of the pattern. But you can use
|
|
||||||
|:execute| when needed.
|
|
||||||
Compressed help files will not be searched (Fedora
|
|
||||||
compresses the help files).
|
|
||||||
|
|
||||||
*:lh* *:lhelpgrep*
|
|
||||||
:lh[elpgrep] {pattern}[@xx]
|
|
||||||
Same as ":helpgrep", except the location list is used
|
|
||||||
instead of the quickfix list. If the help window is
|
|
||||||
already opened, then the location list for that window
|
|
||||||
is used. Otherwise, a new help window is opened and
|
|
||||||
the location list for that window is set. The
|
|
||||||
location list for the current window is not changed
|
|
||||||
then.
|
|
||||||
|
|
||||||
*:exu* *:exusage*
|
|
||||||
:exu[sage] Show help on Ex commands. Added to simulate the Nvi
|
|
||||||
command.
|
|
||||||
|
|
||||||
*:viu* *:viusage*
|
|
||||||
:viu[sage] Show help on Normal mode commands. Added to simulate
|
|
||||||
the Nvi command.
|
|
||||||
|
|
||||||
When no argument is given to |:help| the file given with the 'helpfile' option
|
|
||||||
will be opened. Otherwise the specified tag is searched for in all "doc/tags"
|
|
||||||
files in the directories specified in the 'runtimepath' option.
|
|
||||||
|
|
||||||
If you would like to open the help in the current window, see this tip:
|
|
||||||
|help-curwin|.
|
|
||||||
|
|
||||||
The initial height of the help window can be set with the 'helpheight' option
|
|
||||||
(default 20).
|
|
||||||
*help-buffer-options*
|
|
||||||
When the help buffer is created, several local options are set to make sure
|
|
||||||
the help text is displayed as it was intended:
|
|
||||||
'iskeyword' nearly all ASCII chars except ' ', '*', '"' and '|'
|
|
||||||
'foldmethod' "manual"
|
|
||||||
'tabstop' 8
|
|
||||||
'arabic' off
|
|
||||||
'binary' off
|
|
||||||
'buflisted' off
|
|
||||||
'cursorbind' off
|
|
||||||
'diff' off
|
|
||||||
'foldenable' off
|
|
||||||
'list' off
|
|
||||||
'modifiable' off
|
|
||||||
'number' off
|
|
||||||
'relativenumber' off
|
|
||||||
'rightleft' off
|
|
||||||
'scrollbind' off
|
|
||||||
'spell' off
|
|
||||||
|
|
||||||
Jump to specific subjects by using tags. This can be done in two ways:
|
|
||||||
- Use the "CTRL-]" command while standing on the name of a command or option.
|
|
||||||
This only works when the tag is a keyword. "<C-Leftmouse>" and
|
|
||||||
"g<LeftMouse>" work just like "CTRL-]".
|
|
||||||
- use the ":ta {subject}" command. This also works with non-keyword
|
|
||||||
characters.
|
|
||||||
|
|
||||||
Use CTRL-T or CTRL-O to jump back.
|
|
||||||
Use ":q" to close the help window.
|
|
||||||
|
|
||||||
If there are several matches for an item you are looking for, this is how you
|
|
||||||
can jump to each one of them:
|
|
||||||
1. Open a help window
|
|
||||||
2. Use the ":tag" command with a slash prepended to the tag. E.g.: >
|
|
||||||
:tag /min
|
|
||||||
3. Use ":tnext" to jump to the next matching tag.
|
|
||||||
|
|
||||||
It is possible to add help files for plugins and other items. You don't need
|
|
||||||
to change the distributed help files for that. See |add-local-help|.
|
|
||||||
|
|
||||||
To write a local help file, see |write-local-help|.
|
|
||||||
|
|
||||||
Note that the title lines from the local help files are automagically added to
|
|
||||||
the "LOCAL ADDITIONS" section in the "help.txt" help file |local-additions|.
|
|
||||||
This is done when viewing the file in Vim, the file itself is not changed. It
|
|
||||||
is done by going through all help files and obtaining the first line of each
|
|
||||||
file. The files in $VIMRUNTIME/doc are skipped.
|
|
||||||
|
|
||||||
*help-xterm-window*
|
|
||||||
If you want to have the help in another xterm window, you could use this
|
|
||||||
command: >
|
|
||||||
:!xterm -e vim +help &
|
|
||||||
<
|
|
||||||
|
|
||||||
*:helpt* *:helptags*
|
|
||||||
*E150* *E151* *E152* *E153* *E154* *E670* *E856*
|
|
||||||
:helpt[ags] [++t] {dir}
|
|
||||||
Generate the help tags file(s) for directory {dir}.
|
|
||||||
When {dir} is ALL then all "doc" directories in
|
|
||||||
'runtimepath' will be used.
|
|
||||||
|
|
||||||
All "*.txt" and "*.??x" files in the directory and
|
|
||||||
sub-directories are scanned for a help tag definition
|
|
||||||
in between stars. The "*.??x" files are for
|
|
||||||
translated docs, they generate the "tags-??" file, see
|
|
||||||
|help-translated|. The generated tags files are
|
|
||||||
sorted.
|
|
||||||
When there are duplicates an error message is given.
|
|
||||||
An existing tags file is silently overwritten.
|
|
||||||
|
|
||||||
The optional "++t" argument forces adding the
|
|
||||||
"help-tags" tag. This is also done when the {dir} is
|
|
||||||
equal to $VIMRUNTIME/doc.
|
|
||||||
|
|
||||||
To rebuild the help tags in the runtime directory
|
|
||||||
(requires write permission there): >
|
|
||||||
:helptags $VIMRUNTIME/doc
|
|
||||||
<
|
|
||||||
|
|
||||||
|
|
||||||
==============================================================================
|
|
||||||
2. Translated help files *help-translated*
|
|
||||||
|
|
||||||
It is possible to add translated help files, next to the original English help
|
|
||||||
files. Vim will search for all help in "doc" directories in 'runtimepath'.
|
|
||||||
|
|
||||||
At this moment translations are available for:
|
|
||||||
Chinese - multiple authors
|
|
||||||
French - translated by David Blanchet
|
|
||||||
Italian - translated by Antonio Colombo
|
|
||||||
Japanese - multiple authors
|
|
||||||
Polish - translated by Mikolaj Machowski
|
|
||||||
Russian - translated by Vassily Ragosin
|
|
||||||
See the Vim website to find them: http://www.vim.org/translations.php
|
|
||||||
|
|
||||||
A set of translated help files consists of these files:
|
|
||||||
|
|
||||||
help.abx
|
|
||||||
howto.abx
|
|
||||||
...
|
|
||||||
tags-ab
|
|
||||||
|
|
||||||
"ab" is the two-letter language code. Thus for Italian the names are:
|
|
||||||
|
|
||||||
help.itx
|
|
||||||
howto.itx
|
|
||||||
...
|
|
||||||
tags-it
|
|
||||||
|
|
||||||
The 'helplang' option can be set to the preferred language(s). The default is
|
|
||||||
set according to the environment. Vim will first try to find a matching tag
|
|
||||||
in the preferred language(s). English is used when it cannot be found.
|
|
||||||
|
|
||||||
To find a tag in a specific language, append "@ab" to a tag, where "ab" is the
|
|
||||||
two-letter language code. Example: >
|
|
||||||
:he user-manual@it
|
|
||||||
:he user-manual@en
|
|
||||||
The first one finds the Italian user manual, even when 'helplang' is empty.
|
|
||||||
The second one finds the English user manual, even when 'helplang' is set to
|
|
||||||
"it".
|
|
||||||
|
|
||||||
When using command-line completion for the ":help" command, the "@en"
|
|
||||||
extension is only shown when a tag exists for multiple languages. When the
|
|
||||||
tag only exists for English "@en" is omitted. When the first candidate has an
|
|
||||||
"@ab" extension and it matches the first language in 'helplang' "@ab" is also
|
|
||||||
omitted.
|
|
||||||
|
|
||||||
When using |CTRL-]| or ":help!" in a non-English help file Vim will try to
|
|
||||||
find the tag in the same language. If not found then 'helplang' will be used
|
|
||||||
to select a language.
|
|
||||||
|
|
||||||
Help files must use latin1 or utf-8 encoding. Vim assumes the encoding is
|
|
||||||
utf-8 when finding non-ASCII characters in the first line. Thus you must
|
|
||||||
translate the header with "For Vim version".
|
|
||||||
|
|
||||||
The same encoding must be used for the help files of one language in one
|
|
||||||
directory. You can use a different encoding for different languages and use
|
|
||||||
a different encoding for help files of the same language but in a different
|
|
||||||
directory.
|
|
||||||
|
|
||||||
Hints for translators:
|
|
||||||
- Do not translate the tags. This makes it possible to use 'helplang' to
|
|
||||||
specify the preferred language. You may add new tags in your language.
|
|
||||||
- When you do not translate a part of a file, add tags to the English version,
|
|
||||||
using the "tag@en" notation.
|
|
||||||
- Make a package with all the files and the tags file available for download.
|
|
||||||
Users can drop it in one of the "doc" directories and start use it.
|
|
||||||
Report this to Bram, so that he can add a link on www.vim.org.
|
|
||||||
- Use the |:helptags| command to generate the tags files. It will find all
|
|
||||||
languages in the specified directory.
|
|
||||||
|
|
||||||
==============================================================================
|
|
||||||
3. Writing help files *help-writing*
|
|
||||||
|
|
||||||
For ease of use, a Vim help file for a plugin should follow the format of the
|
|
||||||
standard Vim help files, except for the first line. If you are writing a new
|
|
||||||
help file it's best to copy one of the existing files and use it as a
|
|
||||||
template.
|
|
||||||
|
|
||||||
The first line in a help file should have the following format:
|
|
||||||
|
|
||||||
*plugin_name.txt* {short description of the plugin}
|
|
||||||
|
|
||||||
The first field is a help tag where ":help plugin_name" will jump to. The
|
|
||||||
remainder of the line, after a Tab, describes the plugin purpose in a short
|
|
||||||
way. This will show up in the "LOCAL ADDITIONS" section of the main help
|
|
||||||
file. Check there that it shows up properly: |local-additions|.
|
|
||||||
|
|
||||||
If you want to add a version number or last modification date, put it in the
|
|
||||||
second line, right aligned.
|
|
||||||
|
|
||||||
At the bottom of the help file, place a Vim modeline to set the 'textwidth'
|
|
||||||
and 'tabstop' options and the 'filetype' to "help". Never set a global option
|
|
||||||
in such a modeline, that can have undesired consequences.
|
|
||||||
|
|
||||||
|
|
||||||
TAGS
|
|
||||||
|
|
||||||
To define a help tag, place the name between asterisks (*tag-name*). The
|
|
||||||
tag-name should be different from all the Vim help tag names and ideally
|
|
||||||
should begin with the name of the Vim plugin. The tag name is usually right
|
|
||||||
aligned on a line.
|
|
||||||
|
|
||||||
When referring to an existing help tag and to create a hot-link, place the
|
|
||||||
name between two bars (|) eg. |help-writing|.
|
|
||||||
|
|
||||||
When referring to a Vim command and to create a hot-link, place the
|
|
||||||
name between two backticks, eg. inside `:filetype`. You will see this is
|
|
||||||
highlighted as a command, like a code block (see below).
|
|
||||||
|
|
||||||
When referring to a Vim option in the help file, place the option name between
|
|
||||||
two single quotes, eg. 'statusline'
|
|
||||||
|
|
||||||
When referring to any other technical term, such as a filename or function
|
|
||||||
parameter, surround it in backticks, eg. `~/.path/to/init.vim`.
|
|
||||||
|
|
||||||
|
|
||||||
HIGHLIGHTING
|
|
||||||
|
|
||||||
To define a column heading, use a tilde character at the end of the line.
|
|
||||||
This will highlight the column heading in a different color. E.g.
|
|
||||||
|
|
||||||
Column heading~
|
|
||||||
#^^^^^^^^^^^^^ markup.heading.header
|
|
||||||
# ^ punctuation.definition.keyword
|
|
||||||
|
|
||||||
To separate sections in a help file, place a series of '=' characters in a
|
|
||||||
line starting from the first column. The section separator line is highlighted
|
|
||||||
differently.
|
|
||||||
|
|
||||||
To quote a block of ex-commands verbatim, place a greater than (>) character
|
|
||||||
at the end of the line before the block and a less than (<) character as the
|
|
||||||
first non-blank on a line following the block. Any line starting in column 1
|
|
||||||
also implicitly stops the block of ex-commands before it. E.g. >
|
|
||||||
function Example_Func()
|
|
||||||
echo "Example"
|
|
||||||
endfunction
|
|
||||||
<
|
|
||||||
|
|
||||||
The following are highlighted differently in a Vim help file:
|
|
||||||
- a special key name expressed either in <> notation as in <PageDown>, or
|
|
||||||
as a Ctrl character as in CTRL-X
|
|
||||||
- anything between {braces}, e.g. {lhs} and {rhs}
|
|
||||||
|
|
||||||
The word "Note", "Notes" and similar automagically receive distinctive
|
|
||||||
highlighting. So do these:
|
|
||||||
*Todo something to do
|
|
||||||
*Error something wrong
|
|
||||||
|
|
||||||
You can find the details in $VIMRUNTIME/syntax/help.vim
|
|
||||||
|
|
||||||
|
|
||||||
vim:tw=78:ts=8:noet:ft=help:norl:
|
|
||||||
#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ comment.line.modeline
|
|
102
assets/syntaxes/02_Extra/syntax_test_man.man
vendored
102
assets/syntaxes/02_Extra/syntax_test_man.man
vendored
@@ -157,108 +157,6 @@ ENVIRONMENT
|
|||||||
systemd reads the log level from this environment variable. This
|
systemd reads the log level from this environment variable. This
|
||||||
can be overridden with --log-level=.
|
can be overridden with --log-level=.
|
||||||
|
|
||||||
ENVIRONMENT VARIABLES
|
|
||||||
Various Git commands use the following environment variables:
|
|
||||||
|
|
||||||
The Git Repository
|
|
||||||
These environment variables apply to all core Git commands. Nb: it is
|
|
||||||
worth noting that they may be used/overridden by SCMS sitting above Git
|
|
||||||
so take care if using a foreign front-end.
|
|
||||||
|
|
||||||
GIT_INDEX_FILE
|
|
||||||
# ^^^^^^^^^^^^^^ support.constant.environment-variable
|
|
||||||
This environment allows the specification of an alternate index
|
|
||||||
file. If not specified, the default of $GIT_DIR/index is used.
|
|
||||||
|
|
||||||
GIT_INDEX_VERSION
|
|
||||||
# ^^^^^^^^^^^^^^^^^ support.constant.environment-variable
|
|
||||||
This environment variable allows the specification of an index
|
|
||||||
version for new repositories. It won’t affect existing index files.
|
|
||||||
By default index file version 2 or 3 is used. See git-update-
|
|
||||||
index(1) for more information.
|
|
||||||
|
|
||||||
COMMANDS
|
|
||||||
This section only lists general commands. For input and output com‐
|
|
||||||
mands, refer to sway-input(5) and sway-output(5).
|
|
||||||
|
|
||||||
The following commands may only be used in the configuration file.
|
|
||||||
|
|
||||||
bar [<bar-id>] <bar-subcommands...>
|
|
||||||
# ^^^ entity.name.command
|
|
||||||
# ^ punctuation.section.brackets.begin
|
|
||||||
# ^ punctuation.definition.generic.begin
|
|
||||||
# ^^^^^^ variable.parameter
|
|
||||||
# ^ punctuation.definition.generic.end
|
|
||||||
# ^ punctuation.section.brackets.end
|
|
||||||
# ^ punctuation.definition.generic.begin
|
|
||||||
# ^^^^^^^^^^^^^^^ variable.parameter
|
|
||||||
# ^ punctuation.definition.generic.end
|
|
||||||
For details on bar subcommands, see sway-bar(5).
|
|
||||||
|
|
||||||
default_orientation horizontal|vertical|auto
|
|
||||||
# ^^^^^^^^^^^^^^^^^^^ entity.name.command
|
|
||||||
# ^^^^^^^^^^ variable.parameter
|
|
||||||
# ^ keyword.operator.logical
|
|
||||||
# ^^^^^^^^ variable.parameter
|
|
||||||
# ^ keyword.operator.logical
|
|
||||||
# ^^^^ variable.parameter
|
|
||||||
Sets the default container layout for tiled containers.
|
|
||||||
|
|
||||||
include <path>
|
|
||||||
Includes another file from path. path can be either a full path or
|
|
||||||
a path relative to the parent config, and expands shell syntax (see
|
|
||||||
wordexp(3) for details). The same include file can only be included
|
|
||||||
once; subsequent attempts will be ignored.
|
|
||||||
|
|
||||||
The following commands cannot be used directly in the configuration
|
|
||||||
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - variable - entity
|
|
||||||
file. They are expected to be used with bindsym or at runtime through
|
|
||||||
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - variable - entity
|
|
||||||
swaymsg(1).
|
|
||||||
|
|
||||||
border none|normal|csd|pixel [<n>]
|
|
||||||
Set border style for focused window. normal includes a border of
|
|
||||||
thickness n and a title bar. pixel is a border without title bar n
|
|
||||||
pixels thick. Default is normal with border thickness 2. csd is
|
|
||||||
short for client-side-decorations, which allows the client to draw
|
|
||||||
its own decorations.
|
|
||||||
|
|
||||||
border toggle
|
|
||||||
# ^^^^^^ entity.name.command
|
|
||||||
Cycles through the available border styles.
|
|
||||||
|
|
||||||
exit
|
|
||||||
# ^^^^ entity.name.command
|
|
||||||
Exit sway and end your Wayland session.
|
|
||||||
|
|
||||||
floating enable|disable|toggle
|
|
||||||
Make focused view floating, non-floating, or the opposite of what
|
|
||||||
it is now.
|
|
||||||
|
|
||||||
<criteria> focus
|
|
||||||
# ^ punctuation.definition.generic.begin
|
|
||||||
# ^^^^^^^^ variable.parameter
|
|
||||||
# ^ punctuation.definition.generic.end
|
|
||||||
# ^^^^^ variable.parameter
|
|
||||||
Moves focus to the container that matches the specified criteria.
|
|
||||||
|
|
||||||
gaps inner|outer|horizontal|vertical|top|right|bottom|left all|current
|
|
||||||
set|plus|minus|toggle <amount>
|
|
||||||
# ^^^ variable.parameter
|
|
||||||
# ^ keyword.operator.logical
|
|
||||||
Changes the inner or outer gaps for either all workspaces or the
|
|
||||||
current workspace. outer gaps can be altered per side with top,
|
|
||||||
right, bottom, and left or per direction with horizontal and verti‐
|
|
||||||
cal.
|
|
||||||
|
|
||||||
layout toggle [split|tabbed|stacking|splitv|splith]
|
|
||||||
[split|tabbed|stacking|splitv|splith]...
|
|
||||||
# ^ punctuation.section.brackets.begin
|
|
||||||
# ^^^^^ variable.parameter
|
|
||||||
# ^ keyword.operator.logical
|
|
||||||
Cycles the layout mode of the focused container through a list of
|
|
||||||
layouts.
|
|
||||||
|
|
||||||
SEE ALSO
|
SEE ALSO
|
||||||
The systemd Homepage[11], systemd-system.conf(5), locale.conf(5)
|
The systemd Homepage[11], systemd-system.conf(5), locale.conf(5)
|
||||||
# ^^^^^^^^^^^^^^^^^^^ entity.name.function
|
# ^^^^^^^^^^^^^^^^^^^ entity.name.function
|
||||||
|
@@ -1,82 +0,0 @@
|
|||||||
# SYNTAX TEST "Requirementstxt.sublime-syntax"
|
|
||||||
# Options
|
|
||||||
# <- punctuation.definition.comment
|
|
||||||
# ^^^^^^^ comment.line
|
|
||||||
--allow-external
|
|
||||||
#^^^^^^^^^^^^^^^ entity.name.function.option
|
|
||||||
--allow-unverified
|
|
||||||
|
|
||||||
# Freeze packages
|
|
||||||
alabaster==0.7.6
|
|
||||||
Babel>=2.9.1
|
|
||||||
docutils==0.12
|
|
||||||
gevent_subprocess==0.1.2
|
|
||||||
gitpython==3.0.7
|
|
||||||
hg-diff==1.2.4
|
|
||||||
#^^^^^^ variable.parameter.package-name
|
|
||||||
# ^^ keyword.operator.logical
|
|
||||||
# ^^^^^ constant.other
|
|
||||||
Jinja2>=2.8.1
|
|
||||||
MarkupSafe==0.23
|
|
||||||
Pygments==2.7.4
|
|
||||||
pytz==2015.7
|
|
||||||
six==1.10.0
|
|
||||||
snowballstemmer==1.2.0
|
|
||||||
Sphinx==1.3.3
|
|
||||||
sphinx-rtd-theme==0.1.9
|
|
||||||
svn==1.0.1
|
|
||||||
zope.interface==4.2.0
|
|
||||||
|
|
||||||
# Examples from PEP508
|
|
||||||
# c.f. https://www.python.org/dev/peps/pep-0508/
|
|
||||||
requests [security,tests] >= 2.8.1, == 2.8.* ; python_version < "2.7" # Comment
|
|
||||||
#^^^^^^^ variable.parameter.package-name
|
|
||||||
# ^^^^^^^^^^^^^^^^ variable.function.extra
|
|
||||||
# ^ punctuation.section.braces.begin
|
|
||||||
# ^ punctuation.separator
|
|
||||||
# ^ punctuation.section.braces.end
|
|
||||||
# ^^ keyword.operator.logical
|
|
||||||
# ^^^^^ constant.other
|
|
||||||
# ^^ keyword.operator.logical
|
|
||||||
# ^^^^^ constant.other
|
|
||||||
# ^ punctuation.definition.annotation
|
|
||||||
# ^^^^^^^^^^^^^^^^^^^^^^^^ meta.annotation
|
|
||||||
# ^^^^^^^^^^^^^^ variable.language
|
|
||||||
# ^ keyword.operator.logical
|
|
||||||
# ^ punctuation.definition.string.begin.double
|
|
||||||
# ^^^^^ string.quoted.double.requirements-txt
|
|
||||||
# ^ punctuation.definition.string.end.double
|
|
||||||
# ^^^^^^^^^ comment.line
|
|
||||||
pip @ https://github.com/pypa/pip/archive/1.3.1.zip#sha1=da9234ee9982d4bbb3c72346a6de940a148ea686
|
|
||||||
# ^ punctuation.definition.keyword
|
|
||||||
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ markup.underline.link.url
|
|
||||||
name @ gopher:/foo/com"
|
|
||||||
foobar[quux]<2,>=3; os_name=='a'
|
|
||||||
|
|
||||||
# VCS repositories
|
|
||||||
-e git+git://git.myproject.org/MyProject#egg=MyProject # Git
|
|
||||||
# <- entity.name.function.option
|
|
||||||
#^ entity.name.function.option
|
|
||||||
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ markup.underline.link.versioncontrols
|
|
||||||
# ^^^^^^^^^^^^^^^ - comment.line
|
|
||||||
# ^^^^^ comment.line
|
|
||||||
-e git://git.myproject.org/MyProject.git@v1.0#egg=MyProject
|
|
||||||
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ markup.underline.link.versioncontrols
|
|
||||||
-e hg+https://hg.myproject.org/MyProject#egg=MyProject # Mercurial
|
|
||||||
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ markup.underline.link.versioncontrols
|
|
||||||
# ^^^^^^^^^^^ comment.line
|
|
||||||
-e hg+http://hg.myproject.org/MyProject@da39a3ee5e6b#egg=MyProject
|
|
||||||
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ markup.underline.link.versioncontrols
|
|
||||||
-e svn+http://svn.myproject.org/svn/MyProject/trunk@2019#egg=MyProject # Subversion
|
|
||||||
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ markup.underline.link.versioncontrols
|
|
||||||
# ^^^^^^^^^^^^ comment.line
|
|
||||||
-e bzr+ssh://user@myproject.org/MyProject/trunk#egg=MyProject # Bazaar
|
|
||||||
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ markup.underline.link.versioncontrols
|
|
||||||
# ^^^^^^^^ comment.line
|
|
||||||
-e bzr+https://bzr.myproject.org/MyProject/trunk@2019#egg=MyProject
|
|
||||||
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ markup.underline.link.versioncontrols
|
|
||||||
|
|
||||||
# Project or archive URL
|
|
||||||
https://github.com/pallets/click/archive/7.0.zip#egg=click
|
|
||||||
#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ markup.underline.link.url
|
|
||||||
# ^^^^^^^^^^ - comment.line
|
|
BIN
assets/themes.bin
vendored
BIN
assets/themes.bin
vendored
Binary file not shown.
2
assets/themes/zenburn
vendored
2
assets/themes/zenburn
vendored
Submodule assets/themes/zenburn updated: 43dc527731...702023d80d
@@ -181,12 +181,12 @@ man 2 select
|
|||||||
|
|
||||||
## インストール
|
## インストール
|
||||||
|
|
||||||
[](https://repology.org/project/bat-cat/versions)
|
[](https://repology.org/project/bat/versions)
|
||||||
|
|
||||||
### On Ubuntu (`apt` を使用)
|
### On Ubuntu (`apt` を使用)
|
||||||
*... や他のDebianベースのLinuxディストリビューション*
|
*... や他のDebianベースのLinuxディストリビューション*
|
||||||
|
|
||||||
[20.04 ("Focal") 以降の Ubuntu](https://packages.ubuntu.com/search?keywords=bat&exact=1) または [2021 年 8 月以降の Debian (Debian 11 - "Bullseye")](https://packages.debian.org/bullseye/bat) では `bat` パッケージが利用できます。
|
Ubuntu Eoan 19.10 または Debian 不安定版 sid 以降の [the Ubuntu `bat` package](https://packages.ubuntu.com/eoan/bat) または [the Debian `bat` package](https://packages.debian.org/sid/bat) からインストールできます:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
apt install bat
|
apt install bat
|
||||||
@@ -366,7 +366,7 @@ ansible-galaxy install aeimer.install_bat
|
|||||||
### From source
|
### From source
|
||||||
|
|
||||||
|
|
||||||
`bat` をソースからビルドしたいならば、Rust 1.64.0 以上の環境が必要です。
|
`bat` をソースからビルドしたいならば、Rust 1.51 以上の環境が必要です。
|
||||||
`cargo` を使用してビルドすることができます:
|
`cargo` を使用してビルドすることができます:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
@@ -416,7 +416,7 @@ scoop install bat
|
|||||||
|
|
||||||
### 소스에서
|
### 소스에서
|
||||||
|
|
||||||
`bat`의 소스를 빌드하기 위해서는, Rust 1.64.0 이상이 필요합니다.
|
`bat`의 소스를 빌드하기 위해서는, Rust 1.51 이상이 필요합니다.
|
||||||
`cargo`를 이용해 전부 빌드할 수 있습니다:
|
`cargo`를 이용해 전부 빌드할 수 있습니다:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
@@ -160,7 +160,7 @@ man 2 select
|
|||||||
|
|
||||||
## Установка
|
## Установка
|
||||||
|
|
||||||
[](https://repology.org/project/bat-cat/versions)
|
[](https://repology.org/project/bat/versions)
|
||||||
|
|
||||||
### Ubuntu (с помощью `apt`)
|
### Ubuntu (с помощью `apt`)
|
||||||
*... и другие дистрибутивы основанные на Debian.*
|
*... и другие дистрибутивы основанные на Debian.*
|
||||||
@@ -344,7 +344,7 @@ ansible-galaxy install aeimer.install_bat
|
|||||||
|
|
||||||
### Из исходников
|
### Из исходников
|
||||||
|
|
||||||
Если вы желаете установить `bat` из исходников, вам понадобится Rust 1.64.0 или выше. После этого используйте `cargo`, чтобы все скомпилировать:
|
Если вы желаете установить `bat` из исходников, вам понадобится Rust 1.51 или выше. После этого используйте `cargo`, чтобы все скомпилировать:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cargo install --locked bat
|
cargo install --locked bat
|
||||||
|
@@ -372,7 +372,7 @@ scoop install bat
|
|||||||
|
|
||||||
### 从源码编译
|
### 从源码编译
|
||||||
|
|
||||||
如果你想要自己构建`bat`,那么你需要安装有高于1.64.0版本的 Rust。
|
如果你想要自己构建`bat`,那么你需要安装有高于1.51版本的 Rust。
|
||||||
|
|
||||||
使用以下命令编译。
|
使用以下命令编译。
|
||||||
|
|
||||||
@@ -550,7 +550,7 @@ bat --generate-config-file
|
|||||||
# 在终端中以斜体输出文本(不是所有终端都支持)
|
# 在终端中以斜体输出文本(不是所有终端都支持)
|
||||||
--italic-text=always
|
--italic-text=always
|
||||||
|
|
||||||
# 使用 C++ 语法来给 Arduino 的 .ino 文件提供高亮
|
# 使用 C++ 语法来给 Ardiuno 的 .ino 文件提供高亮
|
||||||
--map-syntax "*.ino:C++"
|
--map-syntax "*.ino:C++"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@@ -4,17 +4,17 @@ The following table tries to give an overview *from `bat`s perspective*, i.e. we
|
|||||||
categories which are relevant for `bat`. Some of these projects have completely different goals and
|
categories which are relevant for `bat`. Some of these projects have completely different goals and
|
||||||
if you are not looking for a program like `bat`, this comparison might not be for you.
|
if you are not looking for a program like `bat`, this comparison might not be for you.
|
||||||
|
|
||||||
| | bat | [pygments](http://pygments.org/) | [highlight](http://www.andre-simon.de/doku/highlight/highlight.php) | [ccat](https://github.com/jingweno/ccat) | [source-highlight](https://www.gnu.org/software/src-highlite/) | [hicat](https://github.com/rstacruz/hicat) | [coderay](https://github.com/rubychan/coderay) | [rouge](https://github.com/jneen/rouge) | [clp](https://github.com/jpe90/clp) |
|
| | bat | [pygments](http://pygments.org/) | [highlight](http://www.andre-simon.de/doku/highlight/highlight.php) | [ccat](https://github.com/jingweno/ccat) | [source-highlight](https://www.gnu.org/software/src-highlite/) | [hicat](https://github.com/rstacruz/hicat) | [coderay](https://github.com/rubychan/coderay) | [rouge](https://github.com/jneen/rouge) |
|
||||||
|----------------------------------------------|---------------------------------------------------------------------|----------------------------------|---------------------------------------------------------------------|------------------------------------------|----------------------------------------------------------------|-----------------------------------------------------|-----------------------------------------------------|-----------------------------------------------------|-----------------------------------------------------|
|
|----------------------------------------------|---------------------------------------------------------------------|----------------------------------|---------------------------------------------------------------------|------------------------------------------|----------------------------------------------------------------|-----------------------------------------------------|-----------------------------------------------------|-----------------------------------------------------|
|
||||||
| 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: | :x: |
|
| 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: |
|
||||||
| Git integration | :heavy_check_mark: | :x: | :x: | :x: | :x: | :x: | :x: | :x: | :x: |
|
| Git integration | :heavy_check_mark: | :x: | :x: | :x: | :x: | :x: | :x: | :x: |
|
||||||
| Automatic paging | :heavy_check_mark: | :x: | :x: | :x: | :x: | :heavy_check_mark: | :x: | :x: | :x: |
|
| Automatic paging | :heavy_check_mark: | :x: | :x: | :x: | :x: | :heavy_check_mark: | :x: | :x: |
|
||||||
| Languages (circa) | 150 | 300 | 200 | 7 | 80 | 130 | 30 | 130 | 150 |
|
| Languages (circa) | 150 | 300 | 200 | 7 | 80 | 130 | 30 | 130 |
|
||||||
| Extensible (languages, themes) | :heavy_check_mark: | (:heavy_check_mark:) | (:heavy_check_mark:) | :x: | (:heavy_check_mark:) | :x: | :x: | :x: | :heavy_check_mark: |
|
| Extensible (languages, themes) | :heavy_check_mark: | (:heavy_check_mark:) | (:heavy_check_mark:) | :x: | (:heavy_check_mark:) | :x: | :x: | :x: |
|
||||||
| 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: | :heavy_check_mark: |
|
| 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: |
|
||||||
| Execution time [ms] (`jquery-3.3.1.js`) | 422 | 455 | 299 | 39 | 208 | 287 | 128 | 740 | 22 |
|
| Execution time [ms] (`jquery-3.3.1.js`) | 624 | 789 | 400 | 80 | 300 | 316 | 157 | 695 |
|
||||||
| Execution time [ms] (`miniz.c`) | 27 | 169 | 19 | 4 | 36 | 131 | 58 | 231 | 4 |
|
| Execution time [ms] (`miniz.c`) | 66 | 656 | 26 | 8 | 53 | 141 | 75 | 254 |
|
||||||
| Execution time [ms] (957 kB XML file) | 215 | 296 | 236 | 165 | 83 | 412 | 135 | 386 | 127 |
|
| Execution time [ms] (370 kB XML file) | 238 | 487 | 129 | 111 | 110 | 339 | 147 | 359 |
|
||||||
|
|
||||||
If you think that some entries in this table are outdated or wrong, please open a ticket or pull
|
If you think that some entries in this table are outdated or wrong, please open a ticket or pull
|
||||||
request.
|
request.
|
||||||
@@ -49,7 +49,6 @@ cmd_source_highlight="source-highlight --failsafe --infer-lang -f esc -i '$SRC'"
|
|||||||
cmd_hicat="hicat '$SRC'"
|
cmd_hicat="hicat '$SRC'"
|
||||||
cmd_coderay="coderay '$SRC'"
|
cmd_coderay="coderay '$SRC'"
|
||||||
cmd_rouge="rougify '$SRC'"
|
cmd_rouge="rougify '$SRC'"
|
||||||
cmd_clp="clp '$SRC'"
|
|
||||||
|
|
||||||
hyperfine --warmup 3 \
|
hyperfine --warmup 3 \
|
||||||
"$cmd_bat" \
|
"$cmd_bat" \
|
||||||
@@ -61,5 +60,4 @@ hyperfine --warmup 3 \
|
|||||||
"$cmd_hicat" \
|
"$cmd_hicat" \
|
||||||
"$cmd_coderay" \
|
"$cmd_coderay" \
|
||||||
"$cmd_rouge" \
|
"$cmd_rouge" \
|
||||||
"$cmd_clp" \
|
|
||||||
```
|
```
|
||||||
|
@@ -77,13 +77,12 @@ themes (`bat cache --clear`).
|
|||||||
|
|
||||||
The following files have been manually modified after converting from a `.tmLanguage` file:
|
The following files have been manually modified after converting from a `.tmLanguage` file:
|
||||||
|
|
||||||
* `Apache.sublime_syntax`=> removed `conf` and `CONF` file types.
|
* `Apache.sublime_syntax`=> removed `.conf` and `.CONF` file types.
|
||||||
* `Dart.sublime-syntax` => removed `#regex.dart` include.
|
* `Dart.sublime-syntax` => removed `#regex.dart` include.
|
||||||
* `DotENV.sublime-syntax` => added `.env.template`, `env` and `env.*` file types ([upstream PR](https://github.com/zaynali53/DotENV/pull/17)).
|
* `INI.sublime-syntax` => added `.hgrc`, `hgrc`, and `desktop` file types and support for comments after section headers
|
||||||
* `INI.sublime-syntax` => added `.coveragerc`, `.pylintrc`, `.gitlint`, `.hgrc`, `hgrc`, and `desktop` file types and support for comments after section headers.
|
|
||||||
* `Org mode.sublime-syntax` => removed `task` file type.
|
* `Org mode.sublime-syntax` => removed `task` file type.
|
||||||
* `Robot.sublime_syntax` => changed name to "Robot Framework", added `.resource` extension.
|
|
||||||
* `SML.sublime_syntax` => removed `ml` file type.
|
* `SML.sublime_syntax` => removed `ml` file type.
|
||||||
|
* `Robot.sublime_syntax` => changed name to "Robot Framework", added `.resource` extension
|
||||||
|
|
||||||
### Non-submodule additions
|
### Non-submodule additions
|
||||||
|
|
||||||
|
@@ -1,167 +0,0 @@
|
|||||||
A cat(1) clone with syntax highlighting and Git integration.
|
|
||||||
|
|
||||||
Usage: bat [OPTIONS] [FILE]...
|
|
||||||
bat <COMMAND>
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
[FILE]...
|
|
||||||
File(s) to print / concatenate. Use a dash ('-') or no argument at all to read from
|
|
||||||
standard input.
|
|
||||||
|
|
||||||
Options:
|
|
||||||
-A, --show-all
|
|
||||||
Show non-printable characters like space, tab or newline. This option can also be used to
|
|
||||||
print binary files. Use '--tabs' to control the width of the tab-placeholders.
|
|
||||||
|
|
||||||
--nonprintable-notation <notation>
|
|
||||||
Set notation for non-printable characters.
|
|
||||||
|
|
||||||
Possible values:
|
|
||||||
* unicode (␇, ␊, ␀, ..)
|
|
||||||
* caret (^G, ^J, ^@, ..)
|
|
||||||
|
|
||||||
-p, --plain...
|
|
||||||
Only show plain style, no decorations. This is an alias for '--style=plain'. When '-p' is
|
|
||||||
used twice ('-pp'), it also disables automatic paging (alias for '--style=plain
|
|
||||||
--paging=never').
|
|
||||||
|
|
||||||
-l, --language <language>
|
|
||||||
Explicitly set the language for syntax highlighting. The language can be specified as a
|
|
||||||
name (like 'C++' or 'LaTeX') or possible file extension (like 'cpp', 'hpp' or 'md'). Use
|
|
||||||
'--list-languages' to show all supported language names and file extensions.
|
|
||||||
|
|
||||||
-H, --highlight-line <N:M>
|
|
||||||
Highlight the specified line ranges with a different background color For example:
|
|
||||||
'--highlight-line 40' highlights line 40
|
|
||||||
'--highlight-line 30:40' highlights lines 30 to 40
|
|
||||||
'--highlight-line :40' highlights lines 1 to 40
|
|
||||||
'--highlight-line 40:' highlights lines 40 to the end of the file
|
|
||||||
'--highlight-line 30:+10' highlights lines 30 to 40
|
|
||||||
|
|
||||||
--file-name <name>
|
|
||||||
Specify the name to display for a file. Useful when piping data to bat from STDIN when bat
|
|
||||||
does not otherwise know the filename. Note that the provided file name is also used for
|
|
||||||
syntax detection.
|
|
||||||
|
|
||||||
-d, --diff
|
|
||||||
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.
|
|
||||||
|
|
||||||
--diff-context <N>
|
|
||||||
Include N lines of context around added/removed/modified lines when using '--diff'.
|
|
||||||
|
|
||||||
--tabs <T>
|
|
||||||
Set the tab width to T spaces. Use a width of 0 to pass tabs through directly
|
|
||||||
|
|
||||||
--wrap <mode>
|
|
||||||
Specify the text-wrapping mode (*auto*, never, character). The '--terminal-width' option
|
|
||||||
can be used in addition to control the output width.
|
|
||||||
|
|
||||||
-S, --chop-long-lines
|
|
||||||
Truncate all lines longer than screen width. Alias for '--wrap=never'.
|
|
||||||
|
|
||||||
--terminal-width <width>
|
|
||||||
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'.
|
|
||||||
|
|
||||||
-n, --number
|
|
||||||
Only show line numbers, no other decorations. This is an alias for '--style=numbers'
|
|
||||||
|
|
||||||
--color <when>
|
|
||||||
Specify when to use colored output. The automatic mode only enables colors if an
|
|
||||||
interactive terminal is detected - colors are automatically disabled if the output goes to
|
|
||||||
a pipe.
|
|
||||||
Possible values: *auto*, never, always.
|
|
||||||
|
|
||||||
--italic-text <when>
|
|
||||||
Specify when to use ANSI sequences for italic text in the output. Possible values: always,
|
|
||||||
*never*.
|
|
||||||
|
|
||||||
--decorations <when>
|
|
||||||
Specify when to use the decorations that have been specified via '--style'. The automatic
|
|
||||||
mode only enables decorations if an interactive terminal is detected. Possible values:
|
|
||||||
*auto*, never, always.
|
|
||||||
|
|
||||||
-f, --force-colorization
|
|
||||||
Alias for '--decorations=always --color=always'. This is useful if the output of bat is
|
|
||||||
piped to another program, but you want to keep the colorization/decorations.
|
|
||||||
|
|
||||||
--paging <when>
|
|
||||||
Specify when to use the pager. To disable the pager, use --paging=never' or its
|
|
||||||
alias,'-P'. To disable the pager permanently, set BAT_PAGER to an empty string. To control
|
|
||||||
which pager is used, see the '--pager' option. Possible values: *auto*, never, always.
|
|
||||||
|
|
||||||
--pager <command>
|
|
||||||
Determine which pager is used. This option will override the PAGER and BAT_PAGER
|
|
||||||
environment variables. The default pager is 'less'. To control when the pager is used, see
|
|
||||||
the '--paging' option. Example: '--pager "less -RF"'.
|
|
||||||
|
|
||||||
-m, --map-syntax <glob:syntax>
|
|
||||||
Map a glob pattern to an existing syntax name. The glob pattern is matched on the full
|
|
||||||
path and the filename. For example, to highlight *.build files with the Python syntax, use
|
|
||||||
-m '*.build:Python'. To highlight files named '.myignore' with the Git Ignore syntax, use
|
|
||||||
-m '.myignore:Git Ignore'. Note that the right-hand side is the *name* of the syntax, not
|
|
||||||
a file extension.
|
|
||||||
|
|
||||||
--ignored-suffix <ignored-suffix>
|
|
||||||
Ignore extension. For example:
|
|
||||||
'bat --ignored-suffix ".dev" my_file.json.dev' will use JSON syntax, and ignore '.dev'
|
|
||||||
|
|
||||||
--theme <theme>
|
|
||||||
Set the theme for syntax highlighting. Use '--list-themes' to see all available themes. To
|
|
||||||
set a default theme, add the '--theme="..."' option to the configuration file or export
|
|
||||||
the BAT_THEME environment variable (e.g.: export BAT_THEME="...").
|
|
||||||
|
|
||||||
--list-themes
|
|
||||||
Display a list of supported themes for syntax highlighting.
|
|
||||||
|
|
||||||
--style <components>
|
|
||||||
Configure which elements (line numbers, file headers, grid borders, Git modifications, ..)
|
|
||||||
to display in addition to the file contents. The argument is a comma-separated list of
|
|
||||||
components to display (e.g. 'numbers,changes,grid') or a pre-defined style ('full'). To
|
|
||||||
set a default style, add the '--style=".."' option to the configuration file or export the
|
|
||||||
BAT_STYLE environment variable (e.g.: export BAT_STYLE="..").
|
|
||||||
|
|
||||||
Possible values:
|
|
||||||
|
|
||||||
* default: enables recommended style components (default).
|
|
||||||
* full: enables all available components.
|
|
||||||
* auto: same as 'default', unless the output is piped.
|
|
||||||
* plain: disables all available components.
|
|
||||||
* changes: show Git modification markers.
|
|
||||||
* header: alias for 'header-filename'.
|
|
||||||
* header-filename: show filenames before the content.
|
|
||||||
* header-filesize: show file sizes before the content.
|
|
||||||
* grid: vertical/horizontal lines to separate side bar
|
|
||||||
and the header from the content.
|
|
||||||
* rule: horizontal lines to delimit files.
|
|
||||||
* numbers: show line numbers in the side bar.
|
|
||||||
* snip: draw separation lines between distinct line ranges.
|
|
||||||
|
|
||||||
-r, --line-range <N:M>
|
|
||||||
Only print the specified range of lines for each file. For example:
|
|
||||||
'--line-range 30:40' prints lines 30 to 40
|
|
||||||
'--line-range :40' prints lines 1 to 40
|
|
||||||
'--line-range 40:' prints lines 40 to the end of the file
|
|
||||||
'--line-range 40' only prints line 40
|
|
||||||
'--line-range 30:+10' prints lines 30 to 40
|
|
||||||
|
|
||||||
-L, --list-languages
|
|
||||||
Display a list of supported languages for syntax highlighting.
|
|
||||||
|
|
||||||
-u, --unbuffered
|
|
||||||
This option exists for POSIX-compliance reasons ('u' is for 'unbuffered'). The output is
|
|
||||||
always unbuffered - this option is simply ignored.
|
|
||||||
|
|
||||||
--diagnostic
|
|
||||||
Show diagnostic information for bug reports.
|
|
||||||
|
|
||||||
--acknowledgements
|
|
||||||
Show acknowledgements.
|
|
||||||
|
|
||||||
-h, --help
|
|
||||||
Print help (see a summary with '-h')
|
|
||||||
|
|
||||||
-V, --version
|
|
||||||
Print version
|
|
@@ -1,28 +1,38 @@
|
|||||||
# Release checklist
|
# Release checklist
|
||||||
|
|
||||||
|
## Dependencies
|
||||||
|
|
||||||
|
See this page for a good overview: https://deps.rs/repo/github/sharkdp/bat
|
||||||
|
|
||||||
|
- [ ] Optional: update dependencies with `cargo update`. This is also done by
|
||||||
|
dependabot, so it is not strictly necessary.
|
||||||
|
- [ ] Install [cargo-outdated](https://crates.io/crates/cargo-outdated). Check
|
||||||
|
for outdated dependencies with `cargo outdated --root-deps-only` and
|
||||||
|
decide for each of them whether we want to (manually) upgrade. This will
|
||||||
|
require changes to `Cargo.toml`.
|
||||||
|
|
||||||
## Version bump
|
## Version bump
|
||||||
|
|
||||||
- [ ] Update version in `Cargo.toml`. Run `cargo build` to update `Cargo.lock`.
|
- [ ] Update version in `Cargo.toml`. Run `cargo build` to update `Cargo.lock`.
|
||||||
Make sure to `git add` the `Cargo.lock` changes as well.
|
Make sure to `git add` the `Cargo.lock` changes as well.
|
||||||
- [ ] Find the current min. supported Rust version by running
|
- [ ] Find the current min. supported Rust version by running
|
||||||
`cargo metadata --no-deps --format-version 1 | jq -r '.packages[0].rust_version'`.
|
`grep '^\s*MIN_SUPPORTED_RUST_VERSION' .github/workflows/CICD.yml`.
|
||||||
- [ ] Update the version and the min. supported Rust version in `README.md` and
|
- [ ] Update the version and the min. supported Rust version in `README.md` and
|
||||||
`doc/README-*.md`. Check with
|
`doc/README-*.md`. Check with `git grep -i 'rust.*1\.'` and
|
||||||
`git grep -i -e 'rust.*1\.' -e '1\..*rust' | grep README | grep -v tests/`.
|
`git grep -i '1\..*rust'`.
|
||||||
- [ ] Update `CHANGELOG.md`. Introduce a section for the new release.
|
- [ ] Update `CHANGELOG.md`. Introduce a section for the new release.
|
||||||
|
|
||||||
## Update syntaxes and themes (build assets)
|
## Update syntaxes and themes (build assets)
|
||||||
|
|
||||||
- [ ] Install the latest master version (`cargo clean && cargo install --locked -f --path .`) and make
|
- [ ] Install the latest master version (`cargo install -f --path .`) and make
|
||||||
sure that it is available on the `PATH` (`bat --version` should show the
|
sure that it is available on the `PATH` (`bat --version` should show the
|
||||||
new version).
|
new version).
|
||||||
- [ ] Run `assets/create.sh` and check in the binary asset files.
|
- [ ] Run `assets/create.sh` and check in the binary asset files.
|
||||||
|
|
||||||
## Documentation
|
## Documentation
|
||||||
|
|
||||||
- [ ] Review [`-h`](./short-help.txt), [`--help`](./long-help.txt), and the `man` page. The `man` page is shown in
|
- [ ] Review the `-h` and `--help` texts
|
||||||
the output of the CI job called *Documentation*, so look there.
|
- [ ] Review the `man` page
|
||||||
The CI workflow corresponding to the tip of the master branch is a good place to look.
|
|
||||||
|
|
||||||
## Pre-release checks
|
## Pre-release checks
|
||||||
|
|
||||||
@@ -31,14 +41,13 @@
|
|||||||
- [ ] Optional: manually test the new features and command-line options. To do
|
- [ ] Optional: manually test the new features and command-line options. To do
|
||||||
this, install the latest `bat` version again (to include the new syntaxes
|
this, install the latest `bat` version again (to include the new syntaxes
|
||||||
and themes).
|
and themes).
|
||||||
- [ ] Run `cargo publish --dry-run` to make sure that it will
|
- [ ] Run `cargo publish --dry-run --allow-dirty` to make sure that it will
|
||||||
succeed later (after creating the GitHub release).
|
succeed later (after creating the GitHub release).
|
||||||
|
|
||||||
## Release
|
## Release
|
||||||
|
|
||||||
- [ ] Create a tag and push it: `git tag vX.Y.Z; git push origin tag vX.Y.Z`.
|
- [ ] Create a tag and push it: `git tag vX.Y.Z; git push origin tag vX.Y.Z`.
|
||||||
This will trigger the deployment via GitHub Actions.
|
This will trigger the deployment via GitHub Actions.
|
||||||
REMINDER: If your `origin` is a fork, don't forget to push to e.g. `upstream` instead!
|
|
||||||
- [ ] Go to https://github.com/sharkdp/bat/releases/new to create the new
|
- [ ] Go to https://github.com/sharkdp/bat/releases/new to create the new
|
||||||
release. Select the new tag and also use it as the release title. For the
|
release. Select the new tag and also use it as the release title. For the
|
||||||
release notes, copy the corresponding section from `CHANGELOG.md` and
|
release notes, copy the corresponding section from `CHANGELOG.md` and
|
||||||
@@ -51,23 +60,4 @@
|
|||||||
|
|
||||||
## Post-release
|
## Post-release
|
||||||
|
|
||||||
- [ ] Prepare a new "unreleased" section at the top of `CHANGELOG.md`.
|
- [ ] Prepare a new (empty) "unreleased" section at the top of `CHANGELOG.md`.
|
||||||
Put this at the top:
|
|
||||||
|
|
||||||
```
|
|
||||||
# unreleased
|
|
||||||
|
|
||||||
## Features
|
|
||||||
|
|
||||||
## Bugfixes
|
|
||||||
|
|
||||||
## Other
|
|
||||||
|
|
||||||
## Syntaxes
|
|
||||||
|
|
||||||
## Themes
|
|
||||||
|
|
||||||
## `bat` as a library
|
|
||||||
|
|
||||||
|
|
||||||
```
|
|
||||||
|
@@ -1,56 +0,0 @@
|
|||||||
A cat(1) clone with wings.
|
|
||||||
|
|
||||||
Usage: bat [OPTIONS] [FILE]...
|
|
||||||
bat <COMMAND>
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
[FILE]... File(s) to print / concatenate. Use '-' for standard input.
|
|
||||||
|
|
||||||
Options:
|
|
||||||
-A, --show-all
|
|
||||||
Show non-printable characters (space, tab, newline, ..).
|
|
||||||
--nonprintable-notation <notation>
|
|
||||||
Set notation for non-printable characters.
|
|
||||||
-p, --plain...
|
|
||||||
Show plain style (alias for '--style=plain').
|
|
||||||
-l, --language <language>
|
|
||||||
Set the language for syntax highlighting.
|
|
||||||
-H, --highlight-line <N:M>
|
|
||||||
Highlight lines N through M.
|
|
||||||
--file-name <name>
|
|
||||||
Specify the name to display for a file.
|
|
||||||
-d, --diff
|
|
||||||
Only show lines that have been added/removed/modified.
|
|
||||||
--tabs <T>
|
|
||||||
Set the tab width to T spaces.
|
|
||||||
--wrap <mode>
|
|
||||||
Specify the text-wrapping mode (*auto*, never, character).
|
|
||||||
-S, --chop-long-lines
|
|
||||||
Truncate all lines longer than screen width. Alias for '--wrap=never'.
|
|
||||||
-n, --number
|
|
||||||
Show line numbers (alias for '--style=numbers').
|
|
||||||
--color <when>
|
|
||||||
When to use colors (*auto*, never, always).
|
|
||||||
--italic-text <when>
|
|
||||||
Use italics in output (always, *never*)
|
|
||||||
--decorations <when>
|
|
||||||
When to show the decorations (*auto*, never, always).
|
|
||||||
--paging <when>
|
|
||||||
Specify when to use the pager, or use `-P` to disable (*auto*, never, always).
|
|
||||||
-m, --map-syntax <glob:syntax>
|
|
||||||
Use the specified syntax for files matching the glob pattern ('*.cpp:C++').
|
|
||||||
--theme <theme>
|
|
||||||
Set the color theme for syntax highlighting.
|
|
||||||
--list-themes
|
|
||||||
Display all supported highlighting themes.
|
|
||||||
--style <components>
|
|
||||||
Comma-separated list of style elements to display (*default*, auto, full, plain, changes,
|
|
||||||
header, header-filename, header-filesize, grid, rule, numbers, snip).
|
|
||||||
-r, --line-range <N:M>
|
|
||||||
Only print the lines from N to M.
|
|
||||||
-L, --list-languages
|
|
||||||
Display all supported languages.
|
|
||||||
-h, --help
|
|
||||||
Print help (see more with '--help')
|
|
||||||
-V, --version
|
|
||||||
Print version
|
|
@@ -1,7 +1,5 @@
|
|||||||
## Sponsors
|
## Sponsors
|
||||||
|
|
||||||
`bat` development is sponsored by many individuals and companies. Thank you very much!
|
|
||||||
|
|
||||||
Please note, that being sponsored does not affect the individuality of the `bat`
|
Please note, that being sponsored does not affect the individuality of the `bat`
|
||||||
project or affect the maintainers' actions in any way.
|
project or affect the maintainers' actions in any way.
|
||||||
We remain impartial and continue to assess pull requests solely on merit - the
|
We remain impartial and continue to assess pull requests solely on merit - the
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
/// A simple program that lists all supported syntaxes and themes.
|
/// A simple program that prints its own source code using the bat library
|
||||||
use bat::PrettyPrinter;
|
use bat::PrettyPrinter;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
@@ -1 +0,0 @@
|
|||||||
# Defaults are used
|
|
@@ -43,9 +43,8 @@ pub struct SyntaxReferenceInSet<'a> {
|
|||||||
pub syntax_set: &'a SyntaxSet,
|
pub syntax_set: &'a SyntaxSet,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Lazy-loaded syntaxes are already compressed, and we don't want to compress
|
/// Compress for size of ~700 kB instead of ~4600 kB at the cost of ~30% longer deserialization time
|
||||||
/// already compressed data.
|
pub(crate) const COMPRESS_SYNTAXES: bool = true;
|
||||||
pub(crate) const COMPRESS_SYNTAXES: bool = false;
|
|
||||||
|
|
||||||
/// We don't want to compress our [LazyThemeSet] since the lazy-loaded themes
|
/// We don't want to compress our [LazyThemeSet] since the lazy-loaded themes
|
||||||
/// within it are already compressed, and compressing another time just makes
|
/// within it are already compressed, and compressing another time just makes
|
||||||
@@ -69,57 +68,10 @@ impl HighlightingAssets {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The default theme.
|
|
||||||
///
|
|
||||||
/// ### Windows and Linux
|
|
||||||
///
|
|
||||||
/// Windows and most Linux distributions has a dark terminal theme by
|
|
||||||
/// default. On these platforms, this function always returns a theme that
|
|
||||||
/// looks good on a dark background.
|
|
||||||
///
|
|
||||||
/// ### macOS
|
|
||||||
///
|
|
||||||
/// On macOS the default terminal background is light, but it is common that
|
|
||||||
/// Dark Mode is active, which makes the terminal background dark. On this
|
|
||||||
/// platform, the default theme depends on
|
|
||||||
/// ```bash
|
|
||||||
/// defaults read -globalDomain AppleInterfaceStyle
|
|
||||||
/// ```
|
|
||||||
/// To avoid the overhead of the check on macOS, simply specify a theme
|
|
||||||
/// explicitly via `--theme`, `BAT_THEME`, or `~/.config/bat`.
|
|
||||||
///
|
|
||||||
/// See <https://github.com/sharkdp/bat/issues/1746> and
|
|
||||||
/// <https://github.com/sharkdp/bat/issues/1928> for more context.
|
|
||||||
pub fn default_theme() -> &'static str {
|
pub fn default_theme() -> &'static str {
|
||||||
#[cfg(not(target_os = "macos"))]
|
|
||||||
{
|
|
||||||
Self::default_dark_theme()
|
|
||||||
}
|
|
||||||
#[cfg(target_os = "macos")]
|
|
||||||
{
|
|
||||||
if macos_dark_mode_active() {
|
|
||||||
Self::default_dark_theme()
|
|
||||||
} else {
|
|
||||||
Self::default_light_theme()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The default theme that looks good on a dark background.
|
|
||||||
*/
|
|
||||||
fn default_dark_theme() -> &'static str {
|
|
||||||
"Monokai Extended"
|
"Monokai Extended"
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* The default theme that looks good on a light background.
|
|
||||||
*/
|
|
||||||
#[cfg(target_os = "macos")]
|
|
||||||
fn default_light_theme() -> &'static str {
|
|
||||||
"Monokai Extended Light"
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn from_cache(cache_path: &Path) -> Result<Self> {
|
pub fn from_cache(cache_path: &Path) -> Result<Self> {
|
||||||
Ok(HighlightingAssets::new(
|
Ok(HighlightingAssets::new(
|
||||||
SerializedSyntaxSet::FromFile(cache_path.join("syntaxes.bin")),
|
SerializedSyntaxSet::FromFile(cache_path.join("syntaxes.bin")),
|
||||||
@@ -399,26 +351,6 @@ fn asset_from_cache<T: serde::de::DeserializeOwned>(
|
|||||||
.map_err(|_| format!("Could not parse cached {}", description).into())
|
.map_err(|_| format!("Could not parse cached {}", description).into())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(target_os = "macos")]
|
|
||||||
fn macos_dark_mode_active() -> bool {
|
|
||||||
const PREFERENCES_FILE: &str = "Library/Preferences/.GlobalPreferences.plist";
|
|
||||||
const STYLE_KEY: &str = "AppleInterfaceStyle";
|
|
||||||
|
|
||||||
let preferences_file = dirs::home_dir()
|
|
||||||
.map(|home| home.join(PREFERENCES_FILE))
|
|
||||||
.expect("Could not get home directory");
|
|
||||||
|
|
||||||
match plist::Value::from_file(preferences_file).map(|file| file.into_dictionary()) {
|
|
||||||
Ok(Some(preferences)) => match preferences.get(STYLE_KEY).and_then(|val| val.as_string()) {
|
|
||||||
Some(value) => value == "Dark",
|
|
||||||
// If the key does not exist, then light theme is currently in use.
|
|
||||||
None => false,
|
|
||||||
},
|
|
||||||
// Unreachable, in theory. All macOS users have a home directory and preferences file setup.
|
|
||||||
Ok(None) | Err(_) => true,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
@@ -649,22 +581,13 @@ mod tests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn syntax_detection_is_case_insensitive() {
|
fn syntax_detection_is_case_sensitive() {
|
||||||
let mut test = SyntaxDetectionTest::new();
|
let mut test = SyntaxDetectionTest::new();
|
||||||
|
|
||||||
assert_eq!(test.syntax_for_file("README.md"), "Markdown");
|
assert_ne!(test.syntax_for_file("README.MD"), "Markdown");
|
||||||
assert_eq!(test.syntax_for_file("README.mD"), "Markdown");
|
|
||||||
assert_eq!(test.syntax_for_file("README.Md"), "Markdown");
|
|
||||||
assert_eq!(test.syntax_for_file("README.MD"), "Markdown");
|
|
||||||
|
|
||||||
// Adding a mapping for "MD" in addition to "md" should not break the mapping
|
|
||||||
test.syntax_mapping
|
test.syntax_mapping
|
||||||
.insert("*.MD", MappingTarget::MapTo("Markdown"))
|
.insert("*.MD", MappingTarget::MapTo("Markdown"))
|
||||||
.ok();
|
.ok();
|
||||||
|
|
||||||
assert_eq!(test.syntax_for_file("README.md"), "Markdown");
|
|
||||||
assert_eq!(test.syntax_for_file("README.mD"), "Markdown");
|
|
||||||
assert_eq!(test.syntax_for_file("README.Md"), "Markdown");
|
|
||||||
assert_eq!(test.syntax_for_file("README.MD"), "Markdown");
|
assert_eq!(test.syntax_for_file("README.MD"), "Markdown");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -7,7 +7,7 @@ use serde::{Deserialize, Serialize};
|
|||||||
|
|
||||||
use crate::error::*;
|
use crate::error::*;
|
||||||
|
|
||||||
#[derive(Debug, PartialEq, Eq, Default, Serialize, Deserialize)]
|
#[derive(Debug, PartialEq, Default, Serialize, Deserialize)]
|
||||||
pub struct AssetsMetadata {
|
pub struct AssetsMetadata {
|
||||||
bat_version: Option<String>,
|
bat_version: Option<String>,
|
||||||
creation_time: Option<SystemTime>,
|
creation_time: Option<SystemTime>,
|
||||||
|
@@ -1,4 +1,3 @@
|
|||||||
use std::fmt::Write;
|
|
||||||
use std::fs::read_to_string;
|
use std::fs::read_to_string;
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
|
|
||||||
@@ -125,7 +124,7 @@ fn append_to_acknowledgements(
|
|||||||
relative_path: &str,
|
relative_path: &str,
|
||||||
license_text: &str,
|
license_text: &str,
|
||||||
) {
|
) {
|
||||||
write!(acknowledgements, "## {}\n\n{}", relative_path, license_text).ok();
|
acknowledgements.push_str(&format!("## {}\n\n{}", relative_path, license_text));
|
||||||
|
|
||||||
// Make sure the last char is a newline to not mess up formatting later
|
// Make sure the last char is a newline to not mess up formatting later
|
||||||
if acknowledgements
|
if acknowledgements
|
||||||
|
@@ -1,12 +1,13 @@
|
|||||||
use std::collections::HashSet;
|
use std::collections::HashSet;
|
||||||
use std::env;
|
use std::env;
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::Path;
|
||||||
|
use std::str::FromStr;
|
||||||
|
|
||||||
use atty::{self, Stream};
|
use atty::{self, Stream};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
clap_app,
|
clap_app,
|
||||||
config::{get_args_from_config_file, get_args_from_env_opts_var, get_args_from_env_vars},
|
config::{get_args_from_config_file, get_args_from_env_var},
|
||||||
};
|
};
|
||||||
use clap::ArgMatches;
|
use clap::ArgMatches;
|
||||||
|
|
||||||
@@ -21,7 +22,7 @@ use bat::{
|
|||||||
input::Input,
|
input::Input,
|
||||||
line_range::{HighlightedLineRanges, LineRange, LineRanges},
|
line_range::{HighlightedLineRanges, LineRange, LineRanges},
|
||||||
style::{StyleComponent, StyleComponents},
|
style::{StyleComponent, StyleComponents},
|
||||||
MappingTarget, NonprintableNotation, PagingMode, SyntaxMapping, WrappingMode,
|
MappingTarget, PagingMode, SyntaxMapping, WrappingMode,
|
||||||
};
|
};
|
||||||
|
|
||||||
fn is_truecolor_terminal() -> bool {
|
fn is_truecolor_terminal() -> bool {
|
||||||
@@ -31,14 +32,14 @@ fn is_truecolor_terminal() -> bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub struct App {
|
pub struct App {
|
||||||
pub matches: ArgMatches,
|
pub matches: ArgMatches<'static>,
|
||||||
interactive_output: bool,
|
interactive_output: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl App {
|
impl App {
|
||||||
pub fn new() -> Result<Self> {
|
pub fn new() -> Result<Self> {
|
||||||
#[cfg(windows)]
|
#[cfg(windows)]
|
||||||
let _ = nu_ansi_term::enable_ansi_support();
|
let _ = ansi_term::enable_ansi_support();
|
||||||
|
|
||||||
let interactive_output = atty::is(Stream::Stdout);
|
let interactive_output = atty::is(Stream::Stdout);
|
||||||
|
|
||||||
@@ -48,35 +49,21 @@ impl App {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn matches(interactive_output: bool) -> Result<ArgMatches> {
|
fn matches(interactive_output: bool) -> Result<ArgMatches<'static>> {
|
||||||
let args = if wild::args_os().nth(1) == Some("cache".into()) {
|
let args = if wild::args_os().nth(1) == Some("cache".into())
|
||||||
// Skip the config file and env vars
|
|| wild::args_os().any(|arg| arg == "--no-config")
|
||||||
|
{
|
||||||
wild::args_os().collect::<Vec<_>>()
|
|
||||||
} else if wild::args_os().any(|arg| arg == "--no-config") {
|
|
||||||
// Skip the arguments in bats config file
|
// Skip the arguments in bats config file
|
||||||
|
|
||||||
let mut cli_args = wild::args_os();
|
wild::args_os().collect::<Vec<_>>()
|
||||||
let mut args = get_args_from_env_vars();
|
|
||||||
|
|
||||||
// Put the zero-th CLI argument (program name) first
|
|
||||||
args.insert(0, cli_args.next().unwrap());
|
|
||||||
|
|
||||||
// .. and the rest at the end
|
|
||||||
cli_args.for_each(|a| args.push(a));
|
|
||||||
|
|
||||||
args
|
|
||||||
} else {
|
} else {
|
||||||
let mut cli_args = wild::args_os();
|
let mut cli_args = wild::args_os();
|
||||||
|
|
||||||
// Read arguments from bats config file
|
// Read arguments from bats config file
|
||||||
let mut args = get_args_from_env_opts_var()
|
let mut args = get_args_from_env_var()
|
||||||
.unwrap_or_else(get_args_from_config_file)
|
.unwrap_or_else(get_args_from_config_file)
|
||||||
.map_err(|_| "Could not parse configuration file")?;
|
.map_err(|_| "Could not parse configuration file")?;
|
||||||
|
|
||||||
// Selected env vars supersede config vars
|
|
||||||
args.extend(get_args_from_env_vars());
|
|
||||||
|
|
||||||
// Put the zero-th CLI argument (program name) first
|
// Put the zero-th CLI argument (program name) first
|
||||||
args.insert(0, cli_args.next().unwrap());
|
args.insert(0, cli_args.next().unwrap());
|
||||||
|
|
||||||
@@ -92,13 +79,13 @@ impl App {
|
|||||||
pub fn config(&self, inputs: &[Input]) -> Result<Config> {
|
pub fn config(&self, inputs: &[Input]) -> Result<Config> {
|
||||||
let style_components = self.style_components()?;
|
let style_components = self.style_components()?;
|
||||||
|
|
||||||
let paging_mode = match self.matches.get_one::<String>("paging").map(|s| s.as_str()) {
|
let paging_mode = match self.matches.value_of("paging") {
|
||||||
Some("always") => PagingMode::Always,
|
Some("always") => PagingMode::Always,
|
||||||
Some("never") => PagingMode::Never,
|
Some("never") => PagingMode::Never,
|
||||||
Some("auto") | None => {
|
Some("auto") | None => {
|
||||||
// If we have -pp as an option when in auto mode, the pager should be disabled.
|
// If we have -pp as an option when in auto mode, the pager should be disabled.
|
||||||
let extra_plain = self.matches.get_count("plain") > 1;
|
let extra_plain = self.matches.occurrences_of("plain") > 1;
|
||||||
if extra_plain || self.matches.get_flag("no-paging") {
|
if extra_plain || self.matches.is_present("no-paging") {
|
||||||
PagingMode::Never
|
PagingMode::Never
|
||||||
} else if inputs.iter().any(Input::is_stdin) {
|
} else if inputs.iter().any(Input::is_stdin) {
|
||||||
// If we are reading from stdin, only enable paging if we write to an
|
// If we are reading from stdin, only enable paging if we write to an
|
||||||
@@ -120,13 +107,13 @@ impl App {
|
|||||||
|
|
||||||
let mut syntax_mapping = SyntaxMapping::builtin();
|
let mut syntax_mapping = SyntaxMapping::builtin();
|
||||||
|
|
||||||
if let Some(values) = self.matches.get_many::<String>("ignored-suffix") {
|
if let Some(values) = self.matches.values_of("ignored-suffix") {
|
||||||
for suffix in values {
|
for suffix in values {
|
||||||
syntax_mapping.insert_ignored_suffix(suffix);
|
syntax_mapping.insert_ignored_suffix(suffix);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(values) = self.matches.get_many::<String>("map-syntax") {
|
if let Some(values) = self.matches.values_of("map-syntax") {
|
||||||
for from_to in values {
|
for from_to in values {
|
||||||
let parts: Vec<_> = from_to.split(':').collect();
|
let parts: Vec<_> = from_to.split(':').collect();
|
||||||
|
|
||||||
@@ -138,74 +125,54 @@ impl App {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let maybe_term_width = self
|
let maybe_term_width = self.matches.value_of("terminal-width").and_then(|w| {
|
||||||
.matches
|
if w.starts_with('+') || w.starts_with('-') {
|
||||||
.get_one::<String>("terminal-width")
|
// Treat argument as a delta to the current terminal width
|
||||||
.and_then(|w| {
|
w.parse().ok().map(|delta: i16| {
|
||||||
if w.starts_with('+') || w.starts_with('-') {
|
let old_width: u16 = Term::stdout().size().1;
|
||||||
// Treat argument as a delta to the current terminal width
|
let new_width: i32 = i32::from(old_width) + i32::from(delta);
|
||||||
w.parse().ok().map(|delta: i16| {
|
|
||||||
let old_width: u16 = Term::stdout().size().1;
|
|
||||||
let new_width: i32 = i32::from(old_width) + i32::from(delta);
|
|
||||||
|
|
||||||
if new_width <= 0 {
|
if new_width <= 0 {
|
||||||
old_width as usize
|
old_width as usize
|
||||||
} else {
|
} else {
|
||||||
new_width as usize
|
new_width as usize
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
w.parse().ok()
|
w.parse().ok()
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Ok(Config {
|
Ok(Config {
|
||||||
true_color: is_truecolor_terminal(),
|
true_color: is_truecolor_terminal(),
|
||||||
language: self
|
language: self.matches.value_of("language").or_else(|| {
|
||||||
.matches
|
if self.matches.is_present("show-all") {
|
||||||
.get_one::<String>("language")
|
Some("show-nonprintable")
|
||||||
.map(|s| s.as_str())
|
|
||||||
.or_else(|| {
|
|
||||||
if self.matches.get_flag("show-all") {
|
|
||||||
Some("show-nonprintable")
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
}
|
|
||||||
}),
|
|
||||||
show_nonprintable: self.matches.get_flag("show-all"),
|
|
||||||
nonprintable_notation: match self
|
|
||||||
.matches
|
|
||||||
.get_one::<String>("nonprintable-notation")
|
|
||||||
.map(|s| s.as_str())
|
|
||||||
{
|
|
||||||
Some("unicode") => NonprintableNotation::Unicode,
|
|
||||||
Some("caret") => NonprintableNotation::Caret,
|
|
||||||
_ => unreachable!("other values for --nonprintable-notation are not allowed"),
|
|
||||||
},
|
|
||||||
wrapping_mode: if self.interactive_output || maybe_term_width.is_some() {
|
|
||||||
if !self.matches.get_flag("chop-long-lines") {
|
|
||||||
match self.matches.get_one::<String>("wrap").map(|s| s.as_str()) {
|
|
||||||
Some("character") => WrappingMode::Character,
|
|
||||||
Some("never") => WrappingMode::NoWrapping(true),
|
|
||||||
Some("auto") | None => {
|
|
||||||
if style_components.plain() {
|
|
||||||
WrappingMode::NoWrapping(false)
|
|
||||||
} else {
|
|
||||||
WrappingMode::Character
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_ => unreachable!("other values for --wrap are not allowed"),
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
WrappingMode::NoWrapping(true)
|
None
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
show_nonprintable: self.matches.is_present("show-all"),
|
||||||
|
wrapping_mode: if self.interactive_output || maybe_term_width.is_some() {
|
||||||
|
match self.matches.value_of("wrap") {
|
||||||
|
Some("character") => WrappingMode::Character,
|
||||||
|
Some("never") => WrappingMode::NoWrapping(true),
|
||||||
|
Some("auto") | None => {
|
||||||
|
if style_components.plain() {
|
||||||
|
WrappingMode::NoWrapping(false)
|
||||||
|
} else {
|
||||||
|
WrappingMode::Character
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => unreachable!("other values for --wrap are not allowed"),
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// We don't have the tty width when piping to another program.
|
// We don't have the tty width when piping to another program.
|
||||||
// There's no point in wrapping when this is the case.
|
// There's no point in wrapping when this is the case.
|
||||||
WrappingMode::NoWrapping(false)
|
WrappingMode::NoWrapping(false)
|
||||||
},
|
},
|
||||||
colored_output: self.matches.get_flag("force-colorization")
|
colored_output: self.matches.is_present("force-colorization")
|
||||||
|| match self.matches.get_one::<String>("color").map(|s| s.as_str()) {
|
|| match self.matches.value_of("color") {
|
||||||
Some("always") => true,
|
Some("always") => true,
|
||||||
Some("never") => false,
|
Some("never") => false,
|
||||||
Some("auto") => env::var_os("NO_COLOR").is_none() && self.interactive_output,
|
Some("auto") => env::var_os("NO_COLOR").is_none() && self.interactive_output,
|
||||||
@@ -214,17 +181,14 @@ impl App {
|
|||||||
paging_mode,
|
paging_mode,
|
||||||
term_width: maybe_term_width.unwrap_or(Term::stdout().size().1 as usize),
|
term_width: maybe_term_width.unwrap_or(Term::stdout().size().1 as usize),
|
||||||
loop_through: !(self.interactive_output
|
loop_through: !(self.interactive_output
|
||||||
|| self.matches.get_one::<String>("color").map(|s| s.as_str()) == Some("always")
|
|| self.matches.value_of("color") == Some("always")
|
||||||
|| self
|
|| self.matches.value_of("decorations") == Some("always")
|
||||||
.matches
|
|| self.matches.is_present("force-colorization")),
|
||||||
.get_one::<String>("decorations")
|
|
||||||
.map(|s| s.as_str())
|
|
||||||
== Some("always")
|
|
||||||
|| self.matches.get_flag("force-colorization")),
|
|
||||||
tab_width: self
|
tab_width: self
|
||||||
.matches
|
.matches
|
||||||
.get_one::<String>("tabs")
|
.value_of("tabs")
|
||||||
.map(String::from)
|
.map(String::from)
|
||||||
|
.or_else(|| env::var("BAT_TABS").ok())
|
||||||
.and_then(|t| t.parse().ok())
|
.and_then(|t| t.parse().ok())
|
||||||
.unwrap_or(
|
.unwrap_or(
|
||||||
if style_components.plain() && paging_mode == PagingMode::Never {
|
if style_components.plain() && paging_mode == PagingMode::Never {
|
||||||
@@ -235,8 +199,9 @@ impl App {
|
|||||||
),
|
),
|
||||||
theme: self
|
theme: self
|
||||||
.matches
|
.matches
|
||||||
.get_one::<String>("theme")
|
.value_of("theme")
|
||||||
.map(String::from)
|
.map(String::from)
|
||||||
|
.or_else(|| env::var("BAT_THEME").ok())
|
||||||
.map(|s| {
|
.map(|s| {
|
||||||
if s == "default" {
|
if s == "default" {
|
||||||
String::from(HighlightingAssets::default_theme())
|
String::from(HighlightingAssets::default_theme())
|
||||||
@@ -245,21 +210,19 @@ impl App {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
.unwrap_or_else(|| String::from(HighlightingAssets::default_theme())),
|
.unwrap_or_else(|| String::from(HighlightingAssets::default_theme())),
|
||||||
visible_lines: match self.matches.try_contains_id("diff").unwrap_or_default()
|
visible_lines: match self.matches.is_present("diff") {
|
||||||
&& self.matches.get_flag("diff")
|
|
||||||
{
|
|
||||||
#[cfg(feature = "git")]
|
#[cfg(feature = "git")]
|
||||||
true => VisibleLines::DiffContext(
|
true => VisibleLines::DiffContext(
|
||||||
self.matches
|
self.matches
|
||||||
.get_one::<String>("diff-context")
|
.value_of("diff-context")
|
||||||
.and_then(|t| t.parse().ok())
|
.and_then(|t| t.parse().ok())
|
||||||
.unwrap_or(2),
|
.unwrap_or(2),
|
||||||
),
|
),
|
||||||
|
|
||||||
_ => VisibleLines::Ranges(
|
_ => VisibleLines::Ranges(
|
||||||
self.matches
|
self.matches
|
||||||
.get_many::<String>("line-range")
|
.values_of("line-range")
|
||||||
.map(|vs| vs.map(|s| LineRange::from(s.as_str())).collect())
|
.map(|vs| vs.map(LineRange::from).collect())
|
||||||
.transpose()?
|
.transpose()?
|
||||||
.map(LineRanges::from)
|
.map(LineRanges::from)
|
||||||
.unwrap_or_default(),
|
.unwrap_or_default(),
|
||||||
@@ -267,47 +230,45 @@ impl App {
|
|||||||
},
|
},
|
||||||
style_components,
|
style_components,
|
||||||
syntax_mapping,
|
syntax_mapping,
|
||||||
pager: self.matches.get_one::<String>("pager").map(|s| s.as_str()),
|
pager: self.matches.value_of("pager"),
|
||||||
use_italic_text: self
|
use_italic_text: self.matches.value_of("italic-text") == Some("always"),
|
||||||
.matches
|
|
||||||
.get_one::<String>("italic-text")
|
|
||||||
.map(|s| s.as_str())
|
|
||||||
== Some("always"),
|
|
||||||
highlighted_lines: self
|
highlighted_lines: self
|
||||||
.matches
|
.matches
|
||||||
.get_many::<String>("highlight-line")
|
.values_of("highlight-line")
|
||||||
.map(|ws| ws.map(|s| LineRange::from(s.as_str())).collect())
|
.map(|ws| ws.map(LineRange::from).collect())
|
||||||
.transpose()?
|
.transpose()?
|
||||||
.map(LineRanges::from)
|
.map(LineRanges::from)
|
||||||
.map(HighlightedLineRanges)
|
.map(HighlightedLineRanges)
|
||||||
.unwrap_or_default(),
|
.unwrap_or_default(),
|
||||||
use_custom_assets: !self.matches.get_flag("no-custom-assets"),
|
use_custom_assets: !self.matches.is_present("no-custom-assets"),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn inputs(&self) -> Result<Vec<Input>> {
|
pub fn inputs(&self) -> Result<Vec<Input>> {
|
||||||
|
// verify equal length of file-names and input FILEs
|
||||||
|
match self.matches.values_of("file-name") {
|
||||||
|
Some(ref filenames)
|
||||||
|
if self.matches.values_of_os("FILE").is_some()
|
||||||
|
&& filenames.len() != self.matches.values_of_os("FILE").unwrap().len() =>
|
||||||
|
{
|
||||||
|
return Err("Must be one file name per input type.".into());
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
let filenames: Option<Vec<&Path>> = self
|
let filenames: Option<Vec<&Path>> = self
|
||||||
.matches
|
.matches
|
||||||
.get_many::<PathBuf>("file-name")
|
.values_of_os("file-name")
|
||||||
.map(|vs| vs.map(|p| p.as_path()).collect::<Vec<_>>());
|
.map(|values| values.map(Path::new).collect());
|
||||||
|
|
||||||
let files: Option<Vec<&Path>> = self
|
|
||||||
.matches
|
|
||||||
.get_many::<PathBuf>("FILE")
|
|
||||||
.map(|vs| vs.map(|p| p.as_path()).collect::<Vec<_>>());
|
|
||||||
|
|
||||||
// verify equal length of file-names and input FILEs
|
|
||||||
if filenames.is_some()
|
|
||||||
&& files.is_some()
|
|
||||||
&& filenames.as_ref().map(|v| v.len()) != files.as_ref().map(|v| v.len())
|
|
||||||
{
|
|
||||||
return Err("Must be one file name per input type.".into());
|
|
||||||
}
|
|
||||||
|
|
||||||
let mut filenames_or_none: Box<dyn Iterator<Item = Option<&Path>>> = match filenames {
|
let mut filenames_or_none: Box<dyn Iterator<Item = Option<&Path>>> = match filenames {
|
||||||
Some(filenames) => Box::new(filenames.into_iter().map(Some)),
|
Some(filenames) => Box::new(filenames.into_iter().map(Some)),
|
||||||
None => Box::new(std::iter::repeat(None)),
|
None => Box::new(std::iter::repeat(None)),
|
||||||
};
|
};
|
||||||
|
let files: Option<Vec<&Path>> = self
|
||||||
|
.matches
|
||||||
|
.values_of_os("FILE")
|
||||||
|
.map(|vs| vs.map(Path::new).collect());
|
||||||
|
|
||||||
if files.is_none() {
|
if files.is_none() {
|
||||||
return Ok(vec![new_stdin_input(
|
return Ok(vec![new_stdin_input(
|
||||||
filenames_or_none.next().unwrap_or(None),
|
filenames_or_none.next().unwrap_or(None),
|
||||||
@@ -333,16 +294,26 @@ impl App {
|
|||||||
|
|
||||||
fn style_components(&self) -> Result<StyleComponents> {
|
fn style_components(&self) -> Result<StyleComponents> {
|
||||||
let matches = &self.matches;
|
let matches = &self.matches;
|
||||||
let mut styled_components = StyleComponents(
|
let mut styled_components =
|
||||||
if matches.get_one::<String>("decorations").map(|s| s.as_str()) == Some("never") {
|
StyleComponents(if matches.value_of("decorations") == Some("never") {
|
||||||
HashSet::new()
|
HashSet::new()
|
||||||
} else if matches.get_flag("number") {
|
} else if matches.is_present("number") {
|
||||||
[StyleComponent::LineNumbers].iter().cloned().collect()
|
[StyleComponent::LineNumbers].iter().cloned().collect()
|
||||||
} else if 0 < matches.get_count("plain") {
|
} else if matches.is_present("plain") {
|
||||||
[StyleComponent::Plain].iter().cloned().collect()
|
[StyleComponent::Plain].iter().cloned().collect()
|
||||||
} else {
|
} else {
|
||||||
|
let env_style_components: Option<Vec<StyleComponent>> = env::var("BAT_STYLE")
|
||||||
|
.ok()
|
||||||
|
.map(|style_str| {
|
||||||
|
style_str
|
||||||
|
.split(',')
|
||||||
|
.map(StyleComponent::from_str)
|
||||||
|
.collect::<Result<Vec<StyleComponent>>>()
|
||||||
|
})
|
||||||
|
.transpose()?;
|
||||||
|
|
||||||
matches
|
matches
|
||||||
.get_one::<String>("style")
|
.value_of("style")
|
||||||
.map(|styles| {
|
.map(|styles| {
|
||||||
styles
|
styles
|
||||||
.split(',')
|
.split(',')
|
||||||
@@ -350,15 +321,15 @@ impl App {
|
|||||||
.filter_map(|style| style.ok())
|
.filter_map(|style| style.ok())
|
||||||
.collect::<Vec<_>>()
|
.collect::<Vec<_>>()
|
||||||
})
|
})
|
||||||
.unwrap_or_else(|| vec![StyleComponent::Default])
|
.or(env_style_components)
|
||||||
|
.unwrap_or_else(|| vec![StyleComponent::Full])
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|style| style.components(self.interactive_output))
|
.map(|style| style.components(self.interactive_output))
|
||||||
.fold(HashSet::new(), |mut acc, components| {
|
.fold(HashSet::new(), |mut acc, components| {
|
||||||
acc.extend(components.iter().cloned());
|
acc.extend(components.iter().cloned());
|
||||||
acc
|
acc
|
||||||
})
|
})
|
||||||
},
|
});
|
||||||
);
|
|
||||||
|
|
||||||
// If `grid` is set, remove `rule` as it is a subset of `grid`, and print a warning.
|
// If `grid` is set, remove `rule` as it is a subset of `grid`, and print a warning.
|
||||||
if styled_components.grid() && styled_components.0.remove(&StyleComponent::Rule) {
|
if styled_components.grid() && styled_components.0.remove(&StyleComponent::Rule) {
|
||||||
|
@@ -1,24 +1,31 @@
|
|||||||
|
use std::borrow::Cow;
|
||||||
use std::fs;
|
use std::fs;
|
||||||
use std::io;
|
use std::io;
|
||||||
use std::path::Path;
|
|
||||||
use std::path::PathBuf;
|
|
||||||
|
|
||||||
use clap::crate_version;
|
use clap::crate_version;
|
||||||
|
|
||||||
|
use crate::directories::PROJECT_DIRS;
|
||||||
|
|
||||||
use bat::assets::HighlightingAssets;
|
use bat::assets::HighlightingAssets;
|
||||||
use bat::assets_metadata::AssetsMetadata;
|
use bat::assets_metadata::AssetsMetadata;
|
||||||
use bat::error::*;
|
use bat::error::*;
|
||||||
|
|
||||||
pub fn clear_assets(cache_dir: &Path) {
|
pub fn config_dir() -> Cow<'static, str> {
|
||||||
clear_asset(cache_dir.join("themes.bin"), "theme set cache");
|
PROJECT_DIRS.config_dir().to_string_lossy()
|
||||||
clear_asset(cache_dir.join("syntaxes.bin"), "syntax set cache");
|
|
||||||
clear_asset(cache_dir.join("metadata.yaml"), "metadata file");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn assets_from_cache_or_binary(
|
pub fn cache_dir() -> Cow<'static, str> {
|
||||||
use_custom_assets: bool,
|
PROJECT_DIRS.cache_dir().to_string_lossy()
|
||||||
cache_dir: &Path,
|
}
|
||||||
) -> Result<HighlightingAssets> {
|
|
||||||
|
pub fn clear_assets() {
|
||||||
|
clear_asset("themes.bin", "theme set cache");
|
||||||
|
clear_asset("syntaxes.bin", "syntax set cache");
|
||||||
|
clear_asset("metadata.yaml", "metadata file");
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn assets_from_cache_or_binary(use_custom_assets: bool) -> Result<HighlightingAssets> {
|
||||||
|
let cache_dir = PROJECT_DIRS.cache_dir();
|
||||||
if let Some(metadata) = AssetsMetadata::load_from_folder(cache_dir)? {
|
if let Some(metadata) = AssetsMetadata::load_from_folder(cache_dir)? {
|
||||||
if !metadata.is_compatible_with(crate_version!()) {
|
if !metadata.is_compatible_with(crate_version!()) {
|
||||||
return Err(format!(
|
return Err(format!(
|
||||||
@@ -43,8 +50,9 @@ pub fn assets_from_cache_or_binary(
|
|||||||
Ok(custom_assets.unwrap_or_else(HighlightingAssets::from_binary))
|
Ok(custom_assets.unwrap_or_else(HighlightingAssets::from_binary))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn clear_asset(path: PathBuf, description: &str) {
|
fn clear_asset(filename: &str, description: &str) {
|
||||||
print!("Clearing {} ... ", description);
|
print!("Clearing {} ... ", description);
|
||||||
|
let path = PROJECT_DIRS.cache_dir().join(filename);
|
||||||
match fs::remove_file(&path) {
|
match fs::remove_file(&path) {
|
||||||
Err(err) if err.kind() == io::ErrorKind::NotFound => {
|
Err(err) if err.kind() == io::ErrorKind::NotFound => {
|
||||||
println!("skipped (not present)");
|
println!("skipped (not present)");
|
||||||
|
@@ -1,9 +1,7 @@
|
|||||||
use clap::{
|
use clap::{crate_name, crate_version, App as ClapApp, AppSettings, Arg, ArgGroup, SubCommand};
|
||||||
crate_name, crate_version, value_parser, Arg, ArgAction, ArgGroup, ColorChoice, Command,
|
|
||||||
};
|
|
||||||
use once_cell::sync::Lazy;
|
use once_cell::sync::Lazy;
|
||||||
use std::env;
|
use std::env;
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::Path;
|
||||||
|
|
||||||
static VERSION: Lazy<String> = Lazy::new(|| {
|
static VERSION: Lazy<String> = Lazy::new(|| {
|
||||||
#[cfg(feature = "bugreport")]
|
#[cfg(feature = "bugreport")]
|
||||||
@@ -18,39 +16,48 @@ static VERSION: Lazy<String> = Lazy::new(|| {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
pub fn build_app(interactive_output: bool) -> Command {
|
pub fn build_app(interactive_output: bool) -> ClapApp<'static, 'static> {
|
||||||
let color_when = if interactive_output && env::var_os("NO_COLOR").is_none() {
|
let clap_color_setting = if interactive_output && env::var_os("NO_COLOR").is_none() {
|
||||||
ColorChoice::Auto
|
AppSettings::ColoredHelp
|
||||||
} else {
|
} else {
|
||||||
ColorChoice::Never
|
AppSettings::ColorNever
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut app = Command::new(crate_name!())
|
let mut app = ClapApp::new(crate_name!())
|
||||||
.version(VERSION.as_str())
|
.version(VERSION.as_str())
|
||||||
.color(color_when)
|
.global_setting(clap_color_setting)
|
||||||
.hide_possible_values(true)
|
.global_setting(AppSettings::DeriveDisplayOrder)
|
||||||
.args_conflicts_with_subcommands(true)
|
.global_setting(AppSettings::UnifiedHelpMessage)
|
||||||
.allow_external_subcommands(true)
|
.global_setting(AppSettings::HidePossibleValuesInHelp)
|
||||||
.disable_help_subcommand(true)
|
.setting(AppSettings::ArgsNegateSubcommands)
|
||||||
|
.setting(AppSettings::AllowExternalSubcommands)
|
||||||
|
.setting(AppSettings::DisableHelpSubcommand)
|
||||||
|
.setting(AppSettings::VersionlessSubcommands)
|
||||||
.max_term_width(100)
|
.max_term_width(100)
|
||||||
.about("A cat(1) clone with wings.")
|
.about(
|
||||||
|
"A cat(1) clone with wings.\n\n\
|
||||||
|
Use '--help' instead of '-h' to see a more detailed version of the help text.",
|
||||||
|
)
|
||||||
|
.after_help(
|
||||||
|
"Note: `bat -h` prints a short and concise overview while `bat --help` gives all \
|
||||||
|
details.",
|
||||||
|
)
|
||||||
.long_about("A cat(1) clone with syntax highlighting and Git integration.")
|
.long_about("A cat(1) clone with syntax highlighting and Git integration.")
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new("FILE")
|
Arg::with_name("FILE")
|
||||||
.help("File(s) to print / concatenate. Use '-' for standard input.")
|
.help("File(s) to print / concatenate. Use '-' for standard input.")
|
||||||
.long_help(
|
.long_help(
|
||||||
"File(s) to print / concatenate. Use a dash ('-') or no argument at all \
|
"File(s) to print / concatenate. Use a dash ('-') or no argument at all \
|
||||||
to read from standard input.",
|
to read from standard input.",
|
||||||
)
|
)
|
||||||
.num_args(1..)
|
.multiple(true)
|
||||||
.value_parser(value_parser!(PathBuf)),
|
.empty_values(false),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new("show-all")
|
Arg::with_name("show-all")
|
||||||
.long("show-all")
|
.long("show-all")
|
||||||
.alias("show-nonprintable")
|
.alias("show-nonprintable")
|
||||||
.short('A')
|
.short("A")
|
||||||
.action(ArgAction::SetTrue)
|
|
||||||
.conflicts_with("language")
|
.conflicts_with("language")
|
||||||
.help("Show non-printable characters (space, tab, newline, ..).")
|
.help("Show non-printable characters (space, tab, newline, ..).")
|
||||||
.long_help(
|
.long_help(
|
||||||
@@ -60,38 +67,22 @@ pub fn build_app(interactive_output: bool) -> Command {
|
|||||||
),
|
),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new("nonprintable-notation")
|
Arg::with_name("plain")
|
||||||
.long("nonprintable-notation")
|
|
||||||
.action(ArgAction::Set)
|
|
||||||
.default_value("unicode")
|
|
||||||
.value_parser(["unicode", "caret"])
|
|
||||||
.value_name("notation")
|
|
||||||
.hide_default_value(true)
|
|
||||||
.help("Set notation for non-printable characters.")
|
|
||||||
.long_help(
|
|
||||||
"Set notation for non-printable characters.\n\n\
|
|
||||||
Possible values:\n \
|
|
||||||
* unicode (␇, ␊, ␀, ..)\n \
|
|
||||||
* caret (^G, ^J, ^@, ..)",
|
|
||||||
),
|
|
||||||
)
|
|
||||||
.arg(
|
|
||||||
Arg::new("plain")
|
|
||||||
.overrides_with("plain")
|
.overrides_with("plain")
|
||||||
.overrides_with("number")
|
.overrides_with("number")
|
||||||
.short('p')
|
.short("p")
|
||||||
.long("plain")
|
.long("plain")
|
||||||
.action(ArgAction::Count)
|
.multiple(true)
|
||||||
.help("Show plain style (alias for '--style=plain').")
|
.help("Show plain style (alias for '--style=plain').")
|
||||||
.long_help(
|
.long_help(
|
||||||
"Only show plain style, no decorations. This is an alias for \
|
"Only show plain style, no decorations. This is an alias for \
|
||||||
'--style=plain'. When '-p' is used twice ('-pp'), it also disables \
|
'--style=plain'. When '-p' is used twice ('-pp'), it also disables \
|
||||||
automatic paging (alias for '--style=plain --paging=never').",
|
automatic paging (alias for '--style=plain --pager=never').",
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new("language")
|
Arg::with_name("language")
|
||||||
.short('l')
|
.short("l")
|
||||||
.long("language")
|
.long("language")
|
||||||
.overrides_with("language")
|
.overrides_with("language")
|
||||||
.help("Set the language for syntax highlighting.")
|
.help("Set the language for syntax highlighting.")
|
||||||
@@ -100,13 +91,16 @@ pub fn build_app(interactive_output: bool) -> Command {
|
|||||||
specified as a name (like 'C++' or 'LaTeX') or possible file extension \
|
specified as a name (like 'C++' or 'LaTeX') or possible file extension \
|
||||||
(like 'cpp', 'hpp' or 'md'). Use '--list-languages' to show all supported \
|
(like 'cpp', 'hpp' or 'md'). Use '--list-languages' to show all supported \
|
||||||
language names and file extensions.",
|
language names and file extensions.",
|
||||||
),
|
)
|
||||||
|
.takes_value(true),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new("highlight-line")
|
Arg::with_name("highlight-line")
|
||||||
.long("highlight-line")
|
.long("highlight-line")
|
||||||
.short('H')
|
.short("H")
|
||||||
.action(ArgAction::Append)
|
.takes_value(true)
|
||||||
|
.number_of_values(1)
|
||||||
|
.multiple(true)
|
||||||
.value_name("N:M")
|
.value_name("N:M")
|
||||||
.help("Highlight lines N through M.")
|
.help("Highlight lines N through M.")
|
||||||
.long_help(
|
.long_help(
|
||||||
@@ -120,11 +114,12 @@ pub fn build_app(interactive_output: bool) -> Command {
|
|||||||
),
|
),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new("file-name")
|
Arg::with_name("file-name")
|
||||||
.long("file-name")
|
.long("file-name")
|
||||||
.action(ArgAction::Append)
|
.takes_value(true)
|
||||||
|
.number_of_values(1)
|
||||||
|
.multiple(true)
|
||||||
.value_name("name")
|
.value_name("name")
|
||||||
.value_parser(value_parser!(PathBuf))
|
|
||||||
.help("Specify the name to display for a file.")
|
.help("Specify the name to display for a file.")
|
||||||
.long_help(
|
.long_help(
|
||||||
"Specify the name to display for a file. Useful when piping \
|
"Specify the name to display for a file. Useful when piping \
|
||||||
@@ -138,11 +133,9 @@ pub fn build_app(interactive_output: bool) -> Command {
|
|||||||
{
|
{
|
||||||
app = app
|
app = app
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new("diff")
|
Arg::with_name("diff")
|
||||||
.long("diff")
|
.long("diff")
|
||||||
.short('d')
|
.short("d")
|
||||||
.action(ArgAction::SetTrue)
|
|
||||||
.conflicts_with("line-range")
|
|
||||||
.help("Only show lines that have been added/removed/modified.")
|
.help("Only show lines that have been added/removed/modified.")
|
||||||
.long_help(
|
.long_help(
|
||||||
"Only show lines that have been added/removed/modified with respect \
|
"Only show lines that have been added/removed/modified with respect \
|
||||||
@@ -150,19 +143,20 @@ pub fn build_app(interactive_output: bool) -> Command {
|
|||||||
),
|
),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new("diff-context")
|
Arg::with_name("diff-context")
|
||||||
.long("diff-context")
|
.long("diff-context")
|
||||||
.overrides_with("diff-context")
|
.overrides_with("diff-context")
|
||||||
|
.takes_value(true)
|
||||||
.value_name("N")
|
.value_name("N")
|
||||||
.value_parser(
|
.validator(
|
||||||
|n: &str| {
|
|n| {
|
||||||
n.parse::<usize>()
|
n.parse::<usize>()
|
||||||
.map_err(|_| "must be a number")
|
.map_err(|_| "must be a number")
|
||||||
.map(|_| n.to_owned()) // Convert to Result<String, &str>
|
.map(|_| ()) // Convert to Result<(), &str>
|
||||||
.map_err(|e| e.to_string())
|
.map_err(|e| e.to_string())
|
||||||
}, // Convert to Result<(), String>
|
}, // Convert to Result<(), String>
|
||||||
)
|
)
|
||||||
.hide_short_help(true)
|
.hidden_short_help(true)
|
||||||
.long_help(
|
.long_help(
|
||||||
"Include N lines of context around added/removed/modified lines when using '--diff'.",
|
"Include N lines of context around added/removed/modified lines when using '--diff'.",
|
||||||
),
|
),
|
||||||
@@ -170,15 +164,16 @@ pub fn build_app(interactive_output: bool) -> Command {
|
|||||||
}
|
}
|
||||||
|
|
||||||
app = app.arg(
|
app = app.arg(
|
||||||
Arg::new("tabs")
|
Arg::with_name("tabs")
|
||||||
.long("tabs")
|
.long("tabs")
|
||||||
.overrides_with("tabs")
|
.overrides_with("tabs")
|
||||||
|
.takes_value(true)
|
||||||
.value_name("T")
|
.value_name("T")
|
||||||
.value_parser(
|
.validator(
|
||||||
|t: &str| {
|
|t| {
|
||||||
t.parse::<u32>()
|
t.parse::<u32>()
|
||||||
.map_err(|_t| "must be a number")
|
.map_err(|_t| "must be a number")
|
||||||
.map(|_t| t.to_owned()) // Convert to Result<String, &str>
|
.map(|_t| ()) // Convert to Result<(), &str>
|
||||||
.map_err(|e| e.to_string())
|
.map_err(|e| e.to_string())
|
||||||
}, // Convert to Result<(), String>
|
}, // Convert to Result<(), String>
|
||||||
)
|
)
|
||||||
@@ -189,11 +184,12 @@ pub fn build_app(interactive_output: bool) -> Command {
|
|||||||
),
|
),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new("wrap")
|
Arg::with_name("wrap")
|
||||||
.long("wrap")
|
.long("wrap")
|
||||||
.overrides_with("wrap")
|
.overrides_with("wrap")
|
||||||
|
.takes_value(true)
|
||||||
.value_name("mode")
|
.value_name("mode")
|
||||||
.value_parser(["auto", "never", "character"])
|
.possible_values(&["auto", "never", "character"])
|
||||||
.default_value("auto")
|
.default_value("auto")
|
||||||
.hide_default_value(true)
|
.hide_default_value(true)
|
||||||
.help("Specify the text-wrapping mode (*auto*, never, character).")
|
.help("Specify the text-wrapping mode (*auto*, never, character).")
|
||||||
@@ -202,27 +198,21 @@ pub fn build_app(interactive_output: bool) -> Command {
|
|||||||
control the output width."),
|
control the output width."),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new("chop-long-lines")
|
Arg::with_name("terminal-width")
|
||||||
.long("chop-long-lines")
|
|
||||||
.short('S')
|
|
||||||
.action(ArgAction::SetTrue)
|
|
||||||
.help("Truncate all lines longer than screen width. Alias for '--wrap=never'."),
|
|
||||||
)
|
|
||||||
.arg(
|
|
||||||
Arg::new("terminal-width")
|
|
||||||
.long("terminal-width")
|
.long("terminal-width")
|
||||||
|
.takes_value(true)
|
||||||
.value_name("width")
|
.value_name("width")
|
||||||
.hide_short_help(true)
|
.hidden_short_help(true)
|
||||||
.allow_hyphen_values(true)
|
.allow_hyphen_values(true)
|
||||||
.value_parser(
|
.validator(
|
||||||
|t: &str| {
|
|t| {
|
||||||
let is_offset = t.starts_with('+') || t.starts_with('-');
|
let is_offset = t.starts_with('+') || t.starts_with('-');
|
||||||
t.parse::<i32>()
|
t.parse::<i32>()
|
||||||
.map_err(|_e| "must be an offset or number")
|
.map_err(|_e| "must be an offset or number")
|
||||||
.and_then(|v| if v == 0 && !is_offset {
|
.and_then(|v| if v == 0 && !is_offset {
|
||||||
Err("terminal width cannot be zero")
|
Err("terminal width cannot be zero")
|
||||||
} else {
|
} else {
|
||||||
Ok(t.to_owned())
|
Ok(())
|
||||||
})
|
})
|
||||||
.map_err(|e| e.to_string())
|
.map_err(|e| e.to_string())
|
||||||
})
|
})
|
||||||
@@ -233,11 +223,10 @@ pub fn build_app(interactive_output: bool) -> Command {
|
|||||||
),
|
),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new("number")
|
Arg::with_name("number")
|
||||||
.long("number")
|
.long("number")
|
||||||
.overrides_with("number")
|
.overrides_with("number")
|
||||||
.short('n')
|
.short("n")
|
||||||
.action(ArgAction::SetTrue)
|
|
||||||
.help("Show line numbers (alias for '--style=numbers').")
|
.help("Show line numbers (alias for '--style=numbers').")
|
||||||
.long_help(
|
.long_help(
|
||||||
"Only show line numbers, no other decorations. This is an alias for \
|
"Only show line numbers, no other decorations. This is an alias for \
|
||||||
@@ -245,11 +234,12 @@ pub fn build_app(interactive_output: bool) -> Command {
|
|||||||
),
|
),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new("color")
|
Arg::with_name("color")
|
||||||
.long("color")
|
.long("color")
|
||||||
.overrides_with("color")
|
.overrides_with("color")
|
||||||
|
.takes_value(true)
|
||||||
.value_name("when")
|
.value_name("when")
|
||||||
.value_parser(["auto", "never", "always"])
|
.possible_values(&["auto", "never", "always"])
|
||||||
.hide_default_value(true)
|
.hide_default_value(true)
|
||||||
.default_value("auto")
|
.default_value("auto")
|
||||||
.help("When to use colors (*auto*, never, always).")
|
.help("When to use colors (*auto*, never, always).")
|
||||||
@@ -261,21 +251,23 @@ pub fn build_app(interactive_output: bool) -> Command {
|
|||||||
),
|
),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new("italic-text")
|
Arg::with_name("italic-text")
|
||||||
.long("italic-text")
|
.long("italic-text")
|
||||||
|
.takes_value(true)
|
||||||
.value_name("when")
|
.value_name("when")
|
||||||
.value_parser(["always", "never"])
|
.possible_values(&["always", "never"])
|
||||||
.default_value("never")
|
.default_value("never")
|
||||||
.hide_default_value(true)
|
.hide_default_value(true)
|
||||||
.help("Use italics in output (always, *never*)")
|
.help("Use italics in output (always, *never*)")
|
||||||
.long_help("Specify when to use ANSI sequences for italic text in the output. Possible values: always, *never*."),
|
.long_help("Specify when to use ANSI sequences for italic text in the output. Possible values: always, *never*."),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new("decorations")
|
Arg::with_name("decorations")
|
||||||
.long("decorations")
|
.long("decorations")
|
||||||
.overrides_with("decorations")
|
.overrides_with("decorations")
|
||||||
|
.takes_value(true)
|
||||||
.value_name("when")
|
.value_name("when")
|
||||||
.value_parser(["auto", "never", "always"])
|
.possible_values(&["auto", "never", "always"])
|
||||||
.default_value("auto")
|
.default_value("auto")
|
||||||
.hide_default_value(true)
|
.hide_default_value(true)
|
||||||
.help("When to show the decorations (*auto*, never, always).")
|
.help("When to show the decorations (*auto*, never, always).")
|
||||||
@@ -286,25 +278,24 @@ pub fn build_app(interactive_output: bool) -> Command {
|
|||||||
),
|
),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new("force-colorization")
|
Arg::with_name("force-colorization")
|
||||||
.long("force-colorization")
|
.long("force-colorization")
|
||||||
.short('f')
|
.short("f")
|
||||||
.action(ArgAction::SetTrue)
|
|
||||||
.conflicts_with("color")
|
.conflicts_with("color")
|
||||||
.conflicts_with("decorations")
|
.conflicts_with("decorations")
|
||||||
.overrides_with("force-colorization")
|
.overrides_with("force-colorization")
|
||||||
.hide_short_help(true)
|
.hidden_short_help(true)
|
||||||
.long_help("Alias for '--decorations=always --color=always'. This is useful \
|
.long_help("Alias for '--decorations=always --color=always'. This is useful \
|
||||||
if the output of bat is piped to another program, but you want \
|
if the output of bat is piped to another program, but you want \
|
||||||
to keep the colorization/decorations.")
|
to keep the colorization/decorations.")
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new("paging")
|
Arg::with_name("paging")
|
||||||
.long("paging")
|
.long("paging")
|
||||||
.overrides_with("paging")
|
.overrides_with("paging")
|
||||||
.overrides_with("no-paging")
|
.takes_value(true)
|
||||||
.value_name("when")
|
.value_name("when")
|
||||||
.value_parser(["auto", "never", "always"])
|
.possible_values(&["auto", "never", "always"])
|
||||||
.default_value("auto")
|
.default_value("auto")
|
||||||
.hide_default_value(true)
|
.hide_default_value(true)
|
||||||
.help("Specify when to use the pager, or use `-P` to disable (*auto*, never, always).")
|
.help("Specify when to use the pager, or use `-P` to disable (*auto*, never, always).")
|
||||||
@@ -316,22 +307,22 @@ pub fn build_app(interactive_output: bool) -> Command {
|
|||||||
),
|
),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new("no-paging")
|
Arg::with_name("no-paging")
|
||||||
.short('P')
|
.short("P")
|
||||||
.long("no-paging")
|
.long("no-paging")
|
||||||
.alias("no-pager")
|
.alias("no-pager")
|
||||||
.action(ArgAction::SetTrue)
|
|
||||||
.overrides_with("no-paging")
|
.overrides_with("no-paging")
|
||||||
.hide(true)
|
.hidden(true)
|
||||||
.hide_short_help(true)
|
.hidden_short_help(true)
|
||||||
.help("Alias for '--paging=never'")
|
.help("Alias for '--paging=never'")
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new("pager")
|
Arg::with_name("pager")
|
||||||
.long("pager")
|
.long("pager")
|
||||||
.overrides_with("pager")
|
.overrides_with("pager")
|
||||||
|
.takes_value(true)
|
||||||
.value_name("command")
|
.value_name("command")
|
||||||
.hide_short_help(true)
|
.hidden_short_help(true)
|
||||||
.help("Determine which pager to use.")
|
.help("Determine which pager to use.")
|
||||||
.long_help(
|
.long_help(
|
||||||
"Determine which pager is used. This option will override the \
|
"Determine which pager is used. This option will override the \
|
||||||
@@ -341,10 +332,12 @@ pub fn build_app(interactive_output: bool) -> Command {
|
|||||||
),
|
),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new("map-syntax")
|
Arg::with_name("map-syntax")
|
||||||
.short('m')
|
.short("m")
|
||||||
.long("map-syntax")
|
.long("map-syntax")
|
||||||
.action(ArgAction::Append)
|
.multiple(true)
|
||||||
|
.takes_value(true)
|
||||||
|
.number_of_values(1)
|
||||||
.value_name("glob:syntax")
|
.value_name("glob:syntax")
|
||||||
.help("Use the specified syntax for files matching the glob pattern ('*.cpp:C++').")
|
.help("Use the specified syntax for files matching the glob pattern ('*.cpp:C++').")
|
||||||
.long_help(
|
.long_help(
|
||||||
@@ -354,21 +347,25 @@ pub fn build_app(interactive_output: bool) -> Command {
|
|||||||
'.myignore' with the Git Ignore syntax, use -m '.myignore:Git Ignore'. Note \
|
'.myignore' with the Git Ignore syntax, use -m '.myignore:Git Ignore'. Note \
|
||||||
that the right-hand side is the *name* of the syntax, not a file extension.",
|
that the right-hand side is the *name* of the syntax, not a file extension.",
|
||||||
)
|
)
|
||||||
|
.takes_value(true),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new("ignored-suffix")
|
Arg::with_name("ignored-suffix")
|
||||||
.action(ArgAction::Append)
|
.number_of_values(1)
|
||||||
|
.multiple(true)
|
||||||
|
.takes_value(true)
|
||||||
.long("ignored-suffix")
|
.long("ignored-suffix")
|
||||||
.hide_short_help(true)
|
.hidden_short_help(true)
|
||||||
.help(
|
.help(
|
||||||
"Ignore extension. For example:\n \
|
"Ignore extension. For example:\n \
|
||||||
'bat --ignored-suffix \".dev\" my_file.json.dev' will use JSON syntax, and ignore '.dev'"
|
'bat --ignored-suffix \".dev\" my_file.json.dev' will use JSON syntax, and ignore '.dev'"
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new("theme")
|
Arg::with_name("theme")
|
||||||
.long("theme")
|
.long("theme")
|
||||||
.overrides_with("theme")
|
.overrides_with("theme")
|
||||||
|
.takes_value(true)
|
||||||
.help("Set the color theme for syntax highlighting.")
|
.help("Set the color theme for syntax highlighting.")
|
||||||
.long_help(
|
.long_help(
|
||||||
"Set the theme for syntax highlighting. Use '--list-themes' to \
|
"Set the theme for syntax highlighting. Use '--list-themes' to \
|
||||||
@@ -379,26 +376,28 @@ pub fn build_app(interactive_output: bool) -> Command {
|
|||||||
),
|
),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new("list-themes")
|
Arg::with_name("list-themes")
|
||||||
.long("list-themes")
|
.long("list-themes")
|
||||||
.action(ArgAction::SetTrue)
|
|
||||||
.help("Display all supported highlighting themes.")
|
.help("Display all supported highlighting themes.")
|
||||||
.long_help("Display a list of supported themes for syntax highlighting."),
|
.long_help("Display a list of supported themes for syntax highlighting."),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new("style")
|
Arg::with_name("style")
|
||||||
.long("style")
|
.long("style")
|
||||||
.value_name("components")
|
.value_name("components")
|
||||||
|
// Need to turn this off for overrides_with to work as we want. See the bottom most
|
||||||
|
// example at https://docs.rs/clap/2.32.0/clap/struct.Arg.html#method.overrides_with
|
||||||
|
.use_delimiter(false)
|
||||||
|
.takes_value(true)
|
||||||
.overrides_with("style")
|
.overrides_with("style")
|
||||||
.overrides_with("plain")
|
.overrides_with("plain")
|
||||||
.overrides_with("number")
|
.overrides_with("number")
|
||||||
// Cannot use claps built in validation because we have to turn off clap's delimiters
|
// Cannot use claps built in validation because we have to turn off clap's delimiters
|
||||||
.value_parser(|val: &str| {
|
.validator(|val| {
|
||||||
let mut invalid_vals = val.split(',').filter(|style| {
|
let mut invalid_vals = val.split(',').filter(|style| {
|
||||||
!&[
|
!&[
|
||||||
"auto",
|
"auto",
|
||||||
"full",
|
"full",
|
||||||
"default",
|
|
||||||
"plain",
|
"plain",
|
||||||
"header",
|
"header",
|
||||||
"header-filename",
|
"header-filename",
|
||||||
@@ -415,12 +414,12 @@ pub fn build_app(interactive_output: bool) -> Command {
|
|||||||
if let Some(invalid) = invalid_vals.next() {
|
if let Some(invalid) = invalid_vals.next() {
|
||||||
Err(format!("Unknown style, '{}'", invalid))
|
Err(format!("Unknown style, '{}'", invalid))
|
||||||
} else {
|
} else {
|
||||||
Ok(val.to_owned())
|
Ok(())
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.help(
|
.help(
|
||||||
"Comma-separated list of style elements to display \
|
"Comma-separated list of style elements to display \
|
||||||
(*default*, auto, full, plain, changes, header, header-filename, header-filesize, grid, rule, numbers, snip).",
|
(*auto*, full, plain, changes, header, grid, rule, numbers, snip).",
|
||||||
)
|
)
|
||||||
.long_help(
|
.long_help(
|
||||||
"Configure which elements (line numbers, file headers, grid \
|
"Configure which elements (line numbers, file headers, grid \
|
||||||
@@ -431,9 +430,8 @@ pub fn build_app(interactive_output: bool) -> Command {
|
|||||||
'--style=\"..\"' option to the configuration file or export the \
|
'--style=\"..\"' option to the configuration file or export the \
|
||||||
BAT_STYLE environment variable (e.g.: export BAT_STYLE=\"..\").\n\n\
|
BAT_STYLE environment variable (e.g.: export BAT_STYLE=\"..\").\n\n\
|
||||||
Possible values:\n\n \
|
Possible values:\n\n \
|
||||||
* default: enables recommended style components (default).\n \
|
* full: enables all available components (default).\n \
|
||||||
* full: enables all available components.\n \
|
* auto: same as 'full', unless the output is piped.\n \
|
||||||
* auto: same as 'default', unless the output is piped.\n \
|
|
||||||
* plain: disables all available components.\n \
|
* plain: disables all available components.\n \
|
||||||
* changes: show Git modification markers.\n \
|
* changes: show Git modification markers.\n \
|
||||||
* header: alias for 'header-filename'.\n \
|
* header: alias for 'header-filename'.\n \
|
||||||
@@ -447,11 +445,14 @@ pub fn build_app(interactive_output: bool) -> Command {
|
|||||||
),
|
),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new("line-range")
|
Arg::with_name("line-range")
|
||||||
.long("line-range")
|
.long("line-range")
|
||||||
.short('r')
|
.short("r")
|
||||||
.action(ArgAction::Append)
|
.multiple(true)
|
||||||
|
.takes_value(true)
|
||||||
|
.number_of_values(1)
|
||||||
.value_name("N:M")
|
.value_name("N:M")
|
||||||
|
.conflicts_with("diff")
|
||||||
.help("Only print the lines from N to M.")
|
.help("Only print the lines from N to M.")
|
||||||
.long_help(
|
.long_help(
|
||||||
"Only print the specified range of lines for each file. \
|
"Only print the specified range of lines for each file. \
|
||||||
@@ -464,20 +465,18 @@ pub fn build_app(interactive_output: bool) -> Command {
|
|||||||
),
|
),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new("list-languages")
|
Arg::with_name("list-languages")
|
||||||
.long("list-languages")
|
.long("list-languages")
|
||||||
.short('L')
|
.short("L")
|
||||||
.action(ArgAction::SetTrue)
|
|
||||||
.conflicts_with("list-themes")
|
.conflicts_with("list-themes")
|
||||||
.help("Display all supported languages.")
|
.help("Display all supported languages.")
|
||||||
.long_help("Display a list of supported languages for syntax highlighting."),
|
.long_help("Display a list of supported languages for syntax highlighting."),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new("unbuffered")
|
Arg::with_name("unbuffered")
|
||||||
.short('u')
|
.short("u")
|
||||||
.long("unbuffered")
|
.long("unbuffered")
|
||||||
.action(ArgAction::SetTrue)
|
.hidden_short_help(true)
|
||||||
.hide_short_help(true)
|
|
||||||
.long_help(
|
.long_help(
|
||||||
"This option exists for POSIX-compliance reasons ('u' is for \
|
"This option exists for POSIX-compliance reasons ('u' is for \
|
||||||
'unbuffered'). The output is always unbuffered - this option \
|
'unbuffered'). The output is always unbuffered - this option \
|
||||||
@@ -485,66 +484,60 @@ pub fn build_app(interactive_output: bool) -> Command {
|
|||||||
),
|
),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new("no-config")
|
Arg::with_name("no-config")
|
||||||
.long("no-config")
|
.long("no-config")
|
||||||
.action(ArgAction::SetTrue)
|
.hidden(true)
|
||||||
.hide(true)
|
|
||||||
.help("Do not use the configuration file"),
|
.help("Do not use the configuration file"),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new("no-custom-assets")
|
Arg::with_name("no-custom-assets")
|
||||||
.long("no-custom-assets")
|
.long("no-custom-assets")
|
||||||
.action(ArgAction::SetTrue)
|
.hidden(true)
|
||||||
.hide(true)
|
|
||||||
.help("Do not load custom assets"),
|
.help("Do not load custom assets"),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new("config-file")
|
Arg::with_name("config-file")
|
||||||
.long("config-file")
|
.long("config-file")
|
||||||
.action(ArgAction::SetTrue)
|
|
||||||
.conflicts_with("list-languages")
|
.conflicts_with("list-languages")
|
||||||
.conflicts_with("list-themes")
|
.conflicts_with("list-themes")
|
||||||
.hide(true)
|
.hidden(true)
|
||||||
.help("Show path to the configuration file."),
|
.help("Show path to the configuration file."),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new("generate-config-file")
|
Arg::with_name("generate-config-file")
|
||||||
.long("generate-config-file")
|
.long("generate-config-file")
|
||||||
.action(ArgAction::SetTrue)
|
|
||||||
.conflicts_with("list-languages")
|
.conflicts_with("list-languages")
|
||||||
.conflicts_with("list-themes")
|
.conflicts_with("list-themes")
|
||||||
.hide(true)
|
.hidden(true)
|
||||||
.help("Generates a default configuration file."),
|
.help("Generates a default configuration file."),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new("config-dir")
|
Arg::with_name("config-dir")
|
||||||
.long("config-dir")
|
.long("config-dir")
|
||||||
.action(ArgAction::SetTrue)
|
.hidden(true)
|
||||||
.hide(true)
|
|
||||||
.help("Show bat's configuration directory."),
|
.help("Show bat's configuration directory."),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new("cache-dir")
|
Arg::with_name("cache-dir")
|
||||||
.long("cache-dir")
|
.long("cache-dir")
|
||||||
.action(ArgAction::SetTrue)
|
.hidden(true)
|
||||||
.hide(true)
|
|
||||||
.help("Show bat's cache directory."),
|
.help("Show bat's cache directory."),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new("diagnostic")
|
Arg::with_name("diagnostic")
|
||||||
.long("diagnostic")
|
.long("diagnostic")
|
||||||
.alias("diagnostics")
|
.alias("diagnostics")
|
||||||
.action(ArgAction::SetTrue)
|
.hidden_short_help(true)
|
||||||
.hide_short_help(true)
|
|
||||||
.help("Show diagnostic information for bug reports.")
|
.help("Show diagnostic information for bug reports.")
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new("acknowledgements")
|
Arg::with_name("acknowledgements")
|
||||||
.long("acknowledgements")
|
.long("acknowledgements")
|
||||||
.action(ArgAction::SetTrue)
|
.hidden_short_help(true)
|
||||||
.hide_short_help(true)
|
|
||||||
.help("Show acknowledgements."),
|
.help("Show acknowledgements."),
|
||||||
);
|
)
|
||||||
|
.help_message("Print this help message.")
|
||||||
|
.version_message("Show version information.");
|
||||||
|
|
||||||
// Check if the current directory contains a file name cache. Otherwise,
|
// Check if the current directory contains a file name cache. Otherwise,
|
||||||
// enable the 'bat cache' subcommand.
|
// enable the 'bat cache' subcommand.
|
||||||
@@ -552,14 +545,12 @@ pub fn build_app(interactive_output: bool) -> Command {
|
|||||||
app
|
app
|
||||||
} else {
|
} else {
|
||||||
app.subcommand(
|
app.subcommand(
|
||||||
Command::new("cache")
|
SubCommand::with_name("cache")
|
||||||
.hide(true)
|
|
||||||
.about("Modify the syntax-definition and theme cache")
|
.about("Modify the syntax-definition and theme cache")
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new("build")
|
Arg::with_name("build")
|
||||||
.long("build")
|
.long("build")
|
||||||
.short('b')
|
.short("b")
|
||||||
.action(ArgAction::SetTrue)
|
|
||||||
.help("Initialize (or update) the syntax/theme cache.")
|
.help("Initialize (or update) the syntax/theme cache.")
|
||||||
.long_help(
|
.long_help(
|
||||||
"Initialize (or update) the syntax/theme cache by loading from \
|
"Initialize (or update) the syntax/theme cache by loading from \
|
||||||
@@ -567,37 +558,37 @@ pub fn build_app(interactive_output: bool) -> Command {
|
|||||||
),
|
),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new("clear")
|
Arg::with_name("clear")
|
||||||
.long("clear")
|
.long("clear")
|
||||||
.short('c')
|
.short("c")
|
||||||
.action(ArgAction::SetTrue)
|
|
||||||
.help("Remove the cached syntax definitions and themes."),
|
.help("Remove the cached syntax definitions and themes."),
|
||||||
)
|
)
|
||||||
.group(
|
.group(
|
||||||
ArgGroup::new("cache-actions")
|
ArgGroup::with_name("cache-actions")
|
||||||
.args(["build", "clear"])
|
.args(&["build", "clear"])
|
||||||
.required(true),
|
.required(true),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new("source")
|
Arg::with_name("source")
|
||||||
.long("source")
|
.long("source")
|
||||||
.requires("build")
|
.requires("build")
|
||||||
|
.takes_value(true)
|
||||||
.value_name("dir")
|
.value_name("dir")
|
||||||
.help("Use a different directory to load syntaxes and themes from."),
|
.help("Use a different directory to load syntaxes and themes from."),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new("target")
|
Arg::with_name("target")
|
||||||
.long("target")
|
.long("target")
|
||||||
.requires("build")
|
.requires("build")
|
||||||
|
.takes_value(true)
|
||||||
.value_name("dir")
|
.value_name("dir")
|
||||||
.help(
|
.help(
|
||||||
"Use a different directory to store the cached syntax and theme set.",
|
"Use a different directory to store the cached syntax and theme set.",
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new("blank")
|
Arg::with_name("blank")
|
||||||
.long("blank")
|
.long("blank")
|
||||||
.action(ArgAction::SetTrue)
|
|
||||||
.requires("build")
|
.requires("build")
|
||||||
.help(
|
.help(
|
||||||
"Create completely new syntax and theme sets \
|
"Create completely new syntax and theme sets \
|
||||||
@@ -605,21 +596,11 @@ pub fn build_app(interactive_output: bool) -> Command {
|
|||||||
),
|
),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new("acknowledgements")
|
Arg::with_name("acknowledgements")
|
||||||
.long("acknowledgements")
|
.long("acknowledgements")
|
||||||
.action(ArgAction::SetTrue)
|
|
||||||
.requires("build")
|
.requires("build")
|
||||||
.help("Build acknowledgements.bin."),
|
.help("Build acknowledgements.bin."),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
.after_long_help(
|
|
||||||
"You can use 'bat cache' to customize syntaxes and themes. \
|
|
||||||
See 'bat cache --help' for more information",
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn verify_app() {
|
|
||||||
build_app(false).debug_assert();
|
|
||||||
}
|
|
||||||
|
@@ -6,22 +6,6 @@ use std::path::PathBuf;
|
|||||||
|
|
||||||
use crate::directories::PROJECT_DIRS;
|
use crate::directories::PROJECT_DIRS;
|
||||||
|
|
||||||
#[cfg(not(target_os = "windows"))]
|
|
||||||
const DEFAULT_SYSTEM_CONFIG_PREFIX: &str = "/etc";
|
|
||||||
|
|
||||||
#[cfg(target_os = "windows")]
|
|
||||||
const DEFAULT_SYSTEM_CONFIG_PREFIX: &str = "C:\\ProgramData";
|
|
||||||
|
|
||||||
pub fn system_config_file() -> PathBuf {
|
|
||||||
let folder = option_env!("BAT_SYSTEM_CONFIG_PREFIX").unwrap_or(DEFAULT_SYSTEM_CONFIG_PREFIX);
|
|
||||||
let mut path = PathBuf::from(folder);
|
|
||||||
|
|
||||||
path.push("bat");
|
|
||||||
path.push("config");
|
|
||||||
|
|
||||||
path
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn config_file() -> PathBuf {
|
pub fn config_file() -> PathBuf {
|
||||||
env::var("BAT_CONFIG_PATH")
|
env::var("BAT_CONFIG_PATH")
|
||||||
.ok()
|
.ok()
|
||||||
@@ -103,21 +87,14 @@ pub fn generate_config_file() -> bat::error::Result<()> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_args_from_config_file() -> Result<Vec<OsString>, shell_words::ParseError> {
|
pub fn get_args_from_config_file() -> Result<Vec<OsString>, shell_words::ParseError> {
|
||||||
let mut config = String::new();
|
Ok(fs::read_to_string(config_file())
|
||||||
|
.ok()
|
||||||
if let Ok(c) = fs::read_to_string(system_config_file()) {
|
.map(|content| get_args_from_str(&content))
|
||||||
config.push_str(&c);
|
.transpose()?
|
||||||
config.push('\n');
|
.unwrap_or_else(Vec::new))
|
||||||
}
|
|
||||||
|
|
||||||
if let Ok(c) = fs::read_to_string(config_file()) {
|
|
||||||
config.push_str(&c);
|
|
||||||
}
|
|
||||||
|
|
||||||
get_args_from_str(&config)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_args_from_env_opts_var() -> Option<Result<Vec<OsString>, shell_words::ParseError>> {
|
pub fn get_args_from_env_var() -> Option<Result<Vec<OsString>, shell_words::ParseError>> {
|
||||||
env::var("BAT_OPTS").ok().map(|s| get_args_from_str(&s))
|
env::var("BAT_OPTS").ok().map(|s| get_args_from_str(&s))
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -137,20 +114,6 @@ fn get_args_from_str(content: &str) -> Result<Vec<OsString>, shell_words::ParseE
|
|||||||
.collect())
|
.collect())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_args_from_env_vars() -> Vec<OsString> {
|
|
||||||
[
|
|
||||||
("--tabs", "BAT_TABS"),
|
|
||||||
("--theme", "BAT_THEME"),
|
|
||||||
("--pager", "BAT_PAGER"),
|
|
||||||
("--style", "BAT_STYLE"),
|
|
||||||
]
|
|
||||||
.iter()
|
|
||||||
.filter_map(|(flag, key)| env::var(key).ok().map(|var| [flag.to_string(), var]))
|
|
||||||
.flatten()
|
|
||||||
.map(|a| a.into())
|
|
||||||
.collect()
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn empty() {
|
fn empty() {
|
||||||
let args = get_args_from_str("").unwrap();
|
let args = get_args_from_str("").unwrap();
|
||||||
|
@@ -26,10 +26,10 @@ impl BatProjectDirs {
|
|||||||
let config_dir_op = env::var_os("XDG_CONFIG_HOME")
|
let config_dir_op = env::var_os("XDG_CONFIG_HOME")
|
||||||
.map(PathBuf::from)
|
.map(PathBuf::from)
|
||||||
.filter(|p| p.is_absolute())
|
.filter(|p| p.is_absolute())
|
||||||
.or_else(|| dirs::home_dir().map(|d| d.join(".config")));
|
.or_else(|| dirs_next::home_dir().map(|d| d.join(".config")));
|
||||||
|
|
||||||
#[cfg(not(target_os = "macos"))]
|
#[cfg(not(target_os = "macos"))]
|
||||||
let config_dir_op = dirs::config_dir();
|
let config_dir_op = dirs_next::config_dir();
|
||||||
|
|
||||||
config_dir_op.map(|d| d.join("bat"))?
|
config_dir_op.map(|d| d.join("bat"))?
|
||||||
};
|
};
|
||||||
@@ -51,10 +51,10 @@ impl BatProjectDirs {
|
|||||||
let cache_dir_op = env::var_os("XDG_CACHE_HOME")
|
let cache_dir_op = env::var_os("XDG_CACHE_HOME")
|
||||||
.map(PathBuf::from)
|
.map(PathBuf::from)
|
||||||
.filter(|p| p.is_absolute())
|
.filter(|p| p.is_absolute())
|
||||||
.or_else(|| dirs::home_dir().map(|d| d.join(".cache")));
|
.or_else(|| dirs_next::home_dir().map(|d| d.join(".cache")));
|
||||||
|
|
||||||
#[cfg(not(target_os = "macos"))]
|
#[cfg(not(target_os = "macos"))]
|
||||||
let cache_dir_op = dirs::cache_dir();
|
let cache_dir_op = dirs_next::cache_dir();
|
||||||
|
|
||||||
cache_dir_op.map(|d| d.join("bat"))
|
cache_dir_op.map(|d| d.join("bat"))
|
||||||
}
|
}
|
||||||
|
@@ -8,24 +8,20 @@ mod directories;
|
|||||||
mod input;
|
mod input;
|
||||||
|
|
||||||
use std::collections::{HashMap, HashSet};
|
use std::collections::{HashMap, HashSet};
|
||||||
use std::fmt::Write as _;
|
|
||||||
use std::io;
|
use std::io;
|
||||||
use std::io::{BufReader, Write};
|
use std::io::{BufReader, Write};
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
use std::process;
|
use std::process;
|
||||||
|
|
||||||
use nu_ansi_term::Color::Green;
|
use ansi_term::Colour::Green;
|
||||||
use nu_ansi_term::Style;
|
use ansi_term::Style;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
app::App,
|
app::App,
|
||||||
config::{config_file, generate_config_file},
|
config::{config_file, generate_config_file},
|
||||||
};
|
};
|
||||||
|
|
||||||
#[cfg(feature = "bugreport")]
|
use assets::{assets_from_cache_or_binary, cache_dir, clear_assets, config_dir};
|
||||||
use crate::config::system_config_file;
|
|
||||||
|
|
||||||
use assets::{assets_from_cache_or_binary, clear_assets};
|
|
||||||
use directories::PROJECT_DIRS;
|
use directories::PROJECT_DIRS;
|
||||||
use globset::GlobMatcher;
|
use globset::GlobMatcher;
|
||||||
|
|
||||||
@@ -41,38 +37,33 @@ use bat::{
|
|||||||
const THEME_PREVIEW_DATA: &[u8] = include_bytes!("../../../assets/theme_preview.rs");
|
const THEME_PREVIEW_DATA: &[u8] = include_bytes!("../../../assets/theme_preview.rs");
|
||||||
|
|
||||||
#[cfg(feature = "build-assets")]
|
#[cfg(feature = "build-assets")]
|
||||||
fn build_assets(matches: &clap::ArgMatches, config_dir: &Path, cache_dir: &Path) -> Result<()> {
|
fn build_assets(matches: &clap::ArgMatches) -> Result<()> {
|
||||||
let source_dir = matches
|
let source_dir = matches
|
||||||
.get_one::<String>("source")
|
.value_of("source")
|
||||||
.map(Path::new)
|
.map(Path::new)
|
||||||
.unwrap_or_else(|| config_dir);
|
.unwrap_or_else(|| PROJECT_DIRS.config_dir());
|
||||||
|
let target_dir = matches
|
||||||
|
.value_of("target")
|
||||||
|
.map(Path::new)
|
||||||
|
.unwrap_or_else(|| PROJECT_DIRS.cache_dir());
|
||||||
|
|
||||||
bat::assets::build(
|
bat::assets::build(
|
||||||
source_dir,
|
source_dir,
|
||||||
!matches.get_flag("blank"),
|
!matches.is_present("blank"),
|
||||||
matches.get_flag("acknowledgements"),
|
matches.is_present("acknowledgements"),
|
||||||
cache_dir,
|
target_dir,
|
||||||
clap::crate_version!(),
|
clap::crate_version!(),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn run_cache_subcommand(
|
fn run_cache_subcommand(matches: &clap::ArgMatches) -> Result<()> {
|
||||||
matches: &clap::ArgMatches,
|
if matches.is_present("build") {
|
||||||
#[cfg(feature = "build-assets")] config_dir: &Path,
|
|
||||||
default_cache_dir: &Path,
|
|
||||||
) -> Result<()> {
|
|
||||||
let cache_dir = matches
|
|
||||||
.get_one::<String>("target")
|
|
||||||
.map(Path::new)
|
|
||||||
.unwrap_or_else(|| default_cache_dir);
|
|
||||||
|
|
||||||
if matches.get_flag("build") {
|
|
||||||
#[cfg(feature = "build-assets")]
|
#[cfg(feature = "build-assets")]
|
||||||
build_assets(matches, config_dir, cache_dir)?;
|
build_assets(matches)?;
|
||||||
#[cfg(not(feature = "build-assets"))]
|
#[cfg(not(feature = "build-assets"))]
|
||||||
println!("bat has been built without the 'build-assets' feature. The 'cache --build' option is not available.");
|
println!("bat has been built without the 'build-assets' feature. The 'cache --build' option is not available.");
|
||||||
} else if matches.get_flag("clear") {
|
} else if matches.is_present("clear") {
|
||||||
clear_assets(cache_dir);
|
clear_assets();
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
@@ -91,10 +82,10 @@ fn get_syntax_mapping_to_paths<'a>(
|
|||||||
map
|
map
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_languages(config: &Config, cache_dir: &Path) -> Result<String> {
|
pub fn get_languages(config: &Config) -> Result<String> {
|
||||||
let mut result: String = String::new();
|
let mut result: String = String::new();
|
||||||
|
|
||||||
let assets = assets_from_cache_or_binary(config.use_custom_assets, cache_dir)?;
|
let assets = assets_from_cache_or_binary(config.use_custom_assets)?;
|
||||||
let mut languages = assets
|
let mut languages = assets
|
||||||
.get_syntaxes()?
|
.get_syntaxes()?
|
||||||
.iter()
|
.iter()
|
||||||
@@ -134,7 +125,7 @@ pub fn get_languages(config: &Config, cache_dir: &Path) -> Result<String> {
|
|||||||
|
|
||||||
if config.loop_through {
|
if config.loop_through {
|
||||||
for lang in languages {
|
for lang in languages {
|
||||||
writeln!(result, "{}:{}", lang.name, lang.file_extensions.join(",")).ok();
|
result += &format!("{}:{}\n", lang.name, lang.file_extensions.join(","));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
let longest = languages
|
let longest = languages
|
||||||
@@ -155,7 +146,7 @@ pub fn get_languages(config: &Config, cache_dir: &Path) -> Result<String> {
|
|||||||
};
|
};
|
||||||
|
|
||||||
for lang in languages {
|
for lang in languages {
|
||||||
write!(result, "{:width$}{}", lang.name, separator, width = longest).ok();
|
result += &format!("{:width$}{}", lang.name, separator, width = longest);
|
||||||
|
|
||||||
// Number of characters on this line so far, wrap before `desired_width`
|
// Number of characters on this line so far, wrap before `desired_width`
|
||||||
let mut num_chars = 0;
|
let mut num_chars = 0;
|
||||||
@@ -166,11 +157,11 @@ pub fn get_languages(config: &Config, cache_dir: &Path) -> Result<String> {
|
|||||||
let new_chars = word.len() + comma_separator.len();
|
let new_chars = word.len() + comma_separator.len();
|
||||||
if num_chars + new_chars >= desired_width {
|
if num_chars + new_chars >= desired_width {
|
||||||
num_chars = 0;
|
num_chars = 0;
|
||||||
write!(result, "\n{:width$}{}", "", separator, width = longest).ok();
|
result += &format!("\n{:width$}{}", "", separator, width = longest);
|
||||||
}
|
}
|
||||||
|
|
||||||
num_chars += new_chars;
|
num_chars += new_chars;
|
||||||
write!(result, "{}", style.paint(&word[..])).ok();
|
result += &format!("{}", style.paint(&word[..]));
|
||||||
if extension.peek().is_some() {
|
if extension.peek().is_some() {
|
||||||
result += comma_separator;
|
result += comma_separator;
|
||||||
}
|
}
|
||||||
@@ -186,8 +177,8 @@ fn theme_preview_file<'a>() -> Input<'a> {
|
|||||||
Input::from_reader(Box::new(BufReader::new(THEME_PREVIEW_DATA)))
|
Input::from_reader(Box::new(BufReader::new(THEME_PREVIEW_DATA)))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn list_themes(cfg: &Config, config_dir: &Path, cache_dir: &Path) -> Result<()> {
|
pub fn list_themes(cfg: &Config) -> Result<()> {
|
||||||
let assets = assets_from_cache_or_binary(cfg.use_custom_assets, cache_dir)?;
|
let assets = assets_from_cache_or_binary(cfg.use_custom_assets)?;
|
||||||
let mut config = cfg.clone();
|
let mut config = cfg.clone();
|
||||||
let mut style = HashSet::new();
|
let mut style = HashSet::new();
|
||||||
style.insert(StyleComponent::Plain);
|
style.insert(StyleComponent::Plain);
|
||||||
@@ -216,7 +207,7 @@ pub fn list_themes(cfg: &Config, config_dir: &Path, cache_dir: &Path) -> Result<
|
|||||||
and are added to the cache with `bat cache --build`. \
|
and are added to the cache with `bat cache --build`. \
|
||||||
For more information, see:\n\n \
|
For more information, see:\n\n \
|
||||||
https://github.com/sharkdp/bat#adding-new-themes",
|
https://github.com/sharkdp/bat#adding-new-themes",
|
||||||
config_dir.join("themes").to_string_lossy()
|
PROJECT_DIRS.config_dir().join("themes").to_string_lossy()
|
||||||
)?;
|
)?;
|
||||||
} else {
|
} else {
|
||||||
for theme in assets.themes() {
|
for theme in assets.themes() {
|
||||||
@@ -227,22 +218,17 @@ pub fn list_themes(cfg: &Config, config_dir: &Path, cache_dir: &Path) -> Result<
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn run_controller(inputs: Vec<Input>, config: &Config, cache_dir: &Path) -> Result<bool> {
|
fn run_controller(inputs: Vec<Input>, config: &Config) -> Result<bool> {
|
||||||
let assets = assets_from_cache_or_binary(config.use_custom_assets, cache_dir)?;
|
let assets = assets_from_cache_or_binary(config.use_custom_assets)?;
|
||||||
let controller = Controller::new(config, &assets);
|
let controller = Controller::new(config, &assets);
|
||||||
controller.run(inputs)
|
controller.run(inputs)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "bugreport")]
|
#[cfg(feature = "bugreport")]
|
||||||
fn invoke_bugreport(app: &App, cache_dir: &Path) {
|
fn invoke_bugreport(app: &App) {
|
||||||
use bugreport::{bugreport, collector::*, format::Markdown};
|
use bugreport::{bugreport, collector::*, format::Markdown};
|
||||||
let pager = bat::config::get_pager_executable(
|
let pager = bat::config::get_pager_executable(app.matches.value_of("pager"))
|
||||||
app.matches.get_one::<String>("pager").map(|s| s.as_str()),
|
.unwrap_or_else(|| "less".to_owned()); // FIXME: Avoid non-canonical path to "less".
|
||||||
)
|
|
||||||
.unwrap_or_else(|| "less".to_owned()); // FIXME: Avoid non-canonical path to "less".
|
|
||||||
|
|
||||||
let mut custom_assets_metadata = cache_dir.to_path_buf();
|
|
||||||
custom_assets_metadata.push("metadata.yaml");
|
|
||||||
|
|
||||||
let mut report = bugreport!()
|
let mut report = bugreport!()
|
||||||
.info(SoftwareVersion::default())
|
.info(SoftwareVersion::default())
|
||||||
@@ -267,13 +253,7 @@ fn invoke_bugreport(app: &App, cache_dir: &Path) {
|
|||||||
"NO_COLOR",
|
"NO_COLOR",
|
||||||
"MANPAGER",
|
"MANPAGER",
|
||||||
]))
|
]))
|
||||||
.info(FileContent::new("System Config file", system_config_file()))
|
|
||||||
.info(FileContent::new("Config file", config_file()))
|
.info(FileContent::new("Config file", config_file()))
|
||||||
.info(FileContent::new(
|
|
||||||
"Custom assets metadata",
|
|
||||||
custom_assets_metadata,
|
|
||||||
))
|
|
||||||
.info(DirectoryEntries::new("Custom assets", cache_dir))
|
|
||||||
.info(CompileTimeInformation::default());
|
.info(CompileTimeInformation::default());
|
||||||
|
|
||||||
#[cfg(feature = "paging")]
|
#[cfg(feature = "paging")]
|
||||||
@@ -292,70 +272,63 @@ fn invoke_bugreport(app: &App, cache_dir: &Path) {
|
|||||||
/// `Ok(false)` if any intermediate errors occurred (were printed).
|
/// `Ok(false)` if any intermediate errors occurred (were printed).
|
||||||
fn run() -> Result<bool> {
|
fn run() -> Result<bool> {
|
||||||
let app = App::new()?;
|
let app = App::new()?;
|
||||||
let config_dir = PROJECT_DIRS.config_dir();
|
|
||||||
let cache_dir = PROJECT_DIRS.cache_dir();
|
|
||||||
|
|
||||||
if app.matches.get_flag("diagnostic") {
|
if app.matches.is_present("diagnostic") {
|
||||||
#[cfg(feature = "bugreport")]
|
#[cfg(feature = "bugreport")]
|
||||||
invoke_bugreport(&app, cache_dir);
|
invoke_bugreport(&app);
|
||||||
#[cfg(not(feature = "bugreport"))]
|
#[cfg(not(feature = "bugreport"))]
|
||||||
println!("bat has been built without the 'bugreport' feature. The '--diagnostic' option is not available.");
|
println!("bat has been built without the 'bugreport' feature. The '--diagnostic' option is not available.");
|
||||||
return Ok(true);
|
return Ok(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
match app.matches.subcommand() {
|
match app.matches.subcommand() {
|
||||||
Some(("cache", cache_matches)) => {
|
("cache", Some(cache_matches)) => {
|
||||||
// If there is a file named 'cache' in the current working directory,
|
// If there is a file named 'cache' in the current working directory,
|
||||||
// arguments for subcommand 'cache' are not mandatory.
|
// arguments for subcommand 'cache' are not mandatory.
|
||||||
// If there are non-zero arguments, execute the subcommand cache, else, open the file cache.
|
// If there are non-zero arguments, execute the subcommand cache, else, open the file cache.
|
||||||
if cache_matches.args_present() {
|
if !cache_matches.args.is_empty() {
|
||||||
run_cache_subcommand(
|
run_cache_subcommand(cache_matches)?;
|
||||||
cache_matches,
|
|
||||||
#[cfg(feature = "build-assets")]
|
|
||||||
config_dir,
|
|
||||||
cache_dir,
|
|
||||||
)?;
|
|
||||||
Ok(true)
|
Ok(true)
|
||||||
} else {
|
} else {
|
||||||
let inputs = vec![Input::ordinary_file("cache")];
|
let inputs = vec![Input::ordinary_file("cache")];
|
||||||
let config = app.config(&inputs)?;
|
let config = app.config(&inputs)?;
|
||||||
|
|
||||||
run_controller(inputs, &config, cache_dir)
|
run_controller(inputs, &config)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
let inputs = app.inputs()?;
|
let inputs = app.inputs()?;
|
||||||
let config = app.config(&inputs)?;
|
let config = app.config(&inputs)?;
|
||||||
|
|
||||||
if app.matches.get_flag("list-languages") {
|
if app.matches.is_present("list-languages") {
|
||||||
let languages: String = get_languages(&config, cache_dir)?;
|
let languages: String = get_languages(&config)?;
|
||||||
let inputs: Vec<Input> = vec![Input::from_reader(Box::new(languages.as_bytes()))];
|
let inputs: Vec<Input> = vec![Input::from_reader(Box::new(languages.as_bytes()))];
|
||||||
let plain_config = Config {
|
let plain_config = Config {
|
||||||
style_components: StyleComponents::new(StyleComponent::Plain.components(false)),
|
style_components: StyleComponents::new(StyleComponent::Plain.components(false)),
|
||||||
paging_mode: PagingMode::QuitIfOneScreen,
|
paging_mode: PagingMode::QuitIfOneScreen,
|
||||||
..Default::default()
|
..Default::default()
|
||||||
};
|
};
|
||||||
run_controller(inputs, &plain_config, cache_dir)
|
run_controller(inputs, &plain_config)
|
||||||
} else if app.matches.get_flag("list-themes") {
|
} else if app.matches.is_present("list-themes") {
|
||||||
list_themes(&config, config_dir, cache_dir)?;
|
list_themes(&config)?;
|
||||||
Ok(true)
|
Ok(true)
|
||||||
} else if app.matches.get_flag("config-file") {
|
} else if app.matches.is_present("config-file") {
|
||||||
println!("{}", config_file().to_string_lossy());
|
println!("{}", config_file().to_string_lossy());
|
||||||
Ok(true)
|
Ok(true)
|
||||||
} else if app.matches.get_flag("generate-config-file") {
|
} else if app.matches.is_present("generate-config-file") {
|
||||||
generate_config_file()?;
|
generate_config_file()?;
|
||||||
Ok(true)
|
Ok(true)
|
||||||
} else if app.matches.get_flag("config-dir") {
|
} else if app.matches.is_present("config-dir") {
|
||||||
writeln!(io::stdout(), "{}", config_dir.to_string_lossy())?;
|
writeln!(io::stdout(), "{}", config_dir())?;
|
||||||
Ok(true)
|
Ok(true)
|
||||||
} else if app.matches.get_flag("cache-dir") {
|
} else if app.matches.is_present("cache-dir") {
|
||||||
writeln!(io::stdout(), "{}", cache_dir.to_string_lossy())?;
|
writeln!(io::stdout(), "{}", cache_dir())?;
|
||||||
Ok(true)
|
Ok(true)
|
||||||
} else if app.matches.get_flag("acknowledgements") {
|
} else if app.matches.is_present("acknowledgements") {
|
||||||
writeln!(io::stdout(), "{}", bat::assets::get_acknowledgements())?;
|
writeln!(io::stdout(), "{}", bat::assets::get_acknowledgements())?;
|
||||||
Ok(true)
|
Ok(true)
|
||||||
} else {
|
} else {
|
||||||
run_controller(inputs, &config, cache_dir)
|
run_controller(inputs, &config)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,5 +1,4 @@
|
|||||||
use crate::line_range::{HighlightedLineRanges, LineRanges};
|
use crate::line_range::{HighlightedLineRanges, LineRanges};
|
||||||
use crate::nonprintable_notation::NonprintableNotation;
|
|
||||||
#[cfg(feature = "paging")]
|
#[cfg(feature = "paging")]
|
||||||
use crate::paging::PagingMode;
|
use crate::paging::PagingMode;
|
||||||
use crate::style::StyleComponents;
|
use crate::style::StyleComponents;
|
||||||
@@ -40,9 +39,6 @@ pub struct Config<'a> {
|
|||||||
/// Whether or not to show/replace non-printable characters like space, tab and newline.
|
/// Whether or not to show/replace non-printable characters like space, tab and newline.
|
||||||
pub show_nonprintable: bool,
|
pub show_nonprintable: bool,
|
||||||
|
|
||||||
/// The configured notation for non-printable characters
|
|
||||||
pub nonprintable_notation: NonprintableNotation,
|
|
||||||
|
|
||||||
/// The character width of the terminal
|
/// The character width of the terminal
|
||||||
pub term_width: usize,
|
pub term_width: usize,
|
||||||
|
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
#[cfg(feature = "git")]
|
#[cfg(feature = "git")]
|
||||||
use crate::diff::LineChange;
|
use crate::diff::LineChange;
|
||||||
use crate::printer::{Colors, InteractivePrinter};
|
use crate::printer::{Colors, InteractivePrinter};
|
||||||
use nu_ansi_term::Style;
|
use ansi_term::Style;
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub(crate) struct DecorationText {
|
pub(crate) struct DecorationText {
|
||||||
|
@@ -17,11 +17,11 @@ pub enum LineChange {
|
|||||||
pub type LineChanges = HashMap<u32, LineChange>;
|
pub type LineChanges = HashMap<u32, LineChange>;
|
||||||
|
|
||||||
pub fn get_git_diff(filename: &Path) -> Option<LineChanges> {
|
pub fn get_git_diff(filename: &Path) -> Option<LineChanges> {
|
||||||
let repo = Repository::discover(filename).ok()?;
|
let repo = Repository::discover(&filename).ok()?;
|
||||||
|
|
||||||
let repo_path_absolute = fs::canonicalize(repo.workdir()?).ok()?;
|
let repo_path_absolute = fs::canonicalize(repo.workdir()?).ok()?;
|
||||||
|
|
||||||
let filepath_absolute = fs::canonicalize(filename).ok()?;
|
let filepath_absolute = fs::canonicalize(&filename).ok()?;
|
||||||
let filepath_relative_to_repo = filepath_absolute.strip_prefix(&repo_path_absolute).ok()?;
|
let filepath_relative_to_repo = filepath_absolute.strip_prefix(&repo_path_absolute).ok()?;
|
||||||
|
|
||||||
let mut diff_options = DiffOptions::new();
|
let mut diff_options = DiffOptions::new();
|
||||||
|
@@ -2,14 +2,11 @@ use std::io::Write;
|
|||||||
use thiserror::Error;
|
use thiserror::Error;
|
||||||
|
|
||||||
#[derive(Error, Debug)]
|
#[derive(Error, Debug)]
|
||||||
#[non_exhaustive]
|
|
||||||
pub enum Error {
|
pub enum Error {
|
||||||
#[error(transparent)]
|
#[error(transparent)]
|
||||||
Io(#[from] ::std::io::Error),
|
Io(#[from] ::std::io::Error),
|
||||||
#[error(transparent)]
|
#[error(transparent)]
|
||||||
SyntectError(#[from] ::syntect::Error),
|
SyntectError(#[from] ::syntect::LoadingError),
|
||||||
#[error(transparent)]
|
|
||||||
SyntectLoadingError(#[from] ::syntect::LoadingError),
|
|
||||||
#[error(transparent)]
|
#[error(transparent)]
|
||||||
ParseIntError(#[from] ::std::num::ParseIntError),
|
ParseIntError(#[from] ::std::num::ParseIntError),
|
||||||
#[error(transparent)]
|
#[error(transparent)]
|
||||||
@@ -43,7 +40,7 @@ impl From<String> for Error {
|
|||||||
pub type Result<T> = std::result::Result<T, Error>;
|
pub type Result<T> = std::result::Result<T, Error>;
|
||||||
|
|
||||||
pub fn default_error_handler(error: &Error, output: &mut dyn Write) {
|
pub fn default_error_handler(error: &Error, output: &mut dyn Write) {
|
||||||
use nu_ansi_term::Color::Red;
|
use ansi_term::Colour::Red;
|
||||||
|
|
||||||
match error {
|
match error {
|
||||||
Error::Io(ref io_error) if io_error.kind() == ::std::io::ErrorKind::BrokenPipe => {
|
Error::Io(ref io_error) if io_error.kind() == ::std::io::ErrorKind::BrokenPipe => {
|
||||||
|
@@ -118,7 +118,7 @@ impl OpenedInput<'_> {
|
|||||||
self.metadata
|
self.metadata
|
||||||
.user_provided_name
|
.user_provided_name
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.or(match self.kind {
|
.or_else(|| match self.kind {
|
||||||
OpenedInputKind::OrdinaryFile(ref path) => Some(path),
|
OpenedInputKind::OrdinaryFile(ref path) => Some(path),
|
||||||
_ => None,
|
_ => None,
|
||||||
})
|
})
|
||||||
|
67
src/less.rs
67
src/less.rs
@@ -3,38 +3,21 @@
|
|||||||
use std::ffi::OsStr;
|
use std::ffi::OsStr;
|
||||||
use std::process::Command;
|
use std::process::Command;
|
||||||
|
|
||||||
#[derive(Debug, PartialEq, Eq)]
|
pub fn retrieve_less_version(less_path: &dyn AsRef<OsStr>) -> Option<usize> {
|
||||||
pub enum LessVersion {
|
|
||||||
Less(usize),
|
|
||||||
BusyBox,
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn retrieve_less_version(less_path: &dyn AsRef<OsStr>) -> Option<LessVersion> {
|
|
||||||
let resolved_path = grep_cli::resolve_binary(less_path.as_ref()).ok()?;
|
let resolved_path = grep_cli::resolve_binary(less_path.as_ref()).ok()?;
|
||||||
|
|
||||||
let cmd = Command::new(resolved_path).arg("--version").output().ok()?;
|
let cmd = Command::new(resolved_path).arg("--version").output().ok()?;
|
||||||
if cmd.status.success() {
|
parse_less_version(&cmd.stdout)
|
||||||
parse_less_version(&cmd.stdout)
|
|
||||||
} else {
|
|
||||||
parse_less_version_busybox(&cmd.stderr)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse_less_version(output: &[u8]) -> Option<LessVersion> {
|
fn parse_less_version(output: &[u8]) -> Option<usize> {
|
||||||
if !output.starts_with(b"less ") {
|
if !output.starts_with(b"less ") {
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
let version = std::str::from_utf8(&output[5..]).ok()?;
|
let version = std::str::from_utf8(&output[5..]).ok()?;
|
||||||
let end = version.find(|c: char| !c.is_ascii_digit())?;
|
let end = version.find(|c: char| !c.is_ascii_digit())?;
|
||||||
Some(LessVersion::Less(version[..end].parse::<usize>().ok()?))
|
version[..end].parse::<usize>().ok()
|
||||||
}
|
|
||||||
|
|
||||||
fn parse_less_version_busybox(output: &[u8]) -> Option<LessVersion> {
|
|
||||||
match std::str::from_utf8(output) {
|
|
||||||
Ok(version) if version.contains("BusyBox ") => Some(LessVersion::BusyBox),
|
|
||||||
_ => None,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@@ -47,7 +30,7 @@ For information about the terms of redistribution,
|
|||||||
see the file named README in the less distribution.
|
see the file named README in the less distribution.
|
||||||
Homepage: http://www.greenwoodsoftware.com/less";
|
Homepage: http://www.greenwoodsoftware.com/less";
|
||||||
|
|
||||||
assert_eq!(Some(LessVersion::Less(487)), parse_less_version(output));
|
assert_eq!(Some(487), parse_less_version(output));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@@ -60,7 +43,7 @@ For information about the terms of redistribution,
|
|||||||
see the file named README in the less distribution.
|
see the file named README in the less distribution.
|
||||||
Homepage: http://www.greenwoodsoftware.com/less";
|
Homepage: http://www.greenwoodsoftware.com/less";
|
||||||
|
|
||||||
assert_eq!(Some(LessVersion::Less(529)), parse_less_version(output));
|
assert_eq!(Some(529), parse_less_version(output));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@@ -73,7 +56,7 @@ For information about the terms of redistribution,
|
|||||||
see the file named README in the less distribution.
|
see the file named README in the less distribution.
|
||||||
Home page: http://www.greenwoodsoftware.com/less";
|
Home page: http://www.greenwoodsoftware.com/less";
|
||||||
|
|
||||||
assert_eq!(Some(LessVersion::Less(551)), parse_less_version(output));
|
assert_eq!(Some(551), parse_less_version(output));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@@ -86,7 +69,7 @@ For information about the terms of redistribution,
|
|||||||
see the file named README in the less distribution.
|
see the file named README in the less distribution.
|
||||||
Home page: https://greenwoodsoftware.com/less";
|
Home page: https://greenwoodsoftware.com/less";
|
||||||
|
|
||||||
assert_eq!(Some(LessVersion::Less(581)), parse_less_version(output));
|
assert_eq!(Some(581), parse_less_version(output));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@@ -94,38 +77,4 @@ fn test_parse_less_version_wrong_program() {
|
|||||||
let output = b"more from util-linux 2.34";
|
let output = b"more from util-linux 2.34";
|
||||||
|
|
||||||
assert_eq!(None, parse_less_version(output));
|
assert_eq!(None, parse_less_version(output));
|
||||||
assert_eq!(None, parse_less_version_busybox(output));
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_parse_less_version_busybox() {
|
|
||||||
let output = b"pkg/less: unrecognized option '--version'
|
|
||||||
BusyBox v1.35.0 (2022-04-21 10:38:11 EDT) multi-call binary.
|
|
||||||
|
|
||||||
Usage: less [-EFIMmNSRh~] [FILE]...
|
|
||||||
|
|
||||||
View FILE (or stdin) one screenful at a time
|
|
||||||
|
|
||||||
-E Quit once the end of a file is reached
|
|
||||||
-F Quit if entire file fits on first screen
|
|
||||||
-I Ignore case in all searches
|
|
||||||
-M,-m Display status line with line numbers
|
|
||||||
and percentage through the file
|
|
||||||
-N Prefix line number to each line
|
|
||||||
-S Truncate long lines
|
|
||||||
-R Remove color escape codes in input
|
|
||||||
-~ Suppress ~s displayed past EOF";
|
|
||||||
|
|
||||||
assert_eq!(
|
|
||||||
Some(LessVersion::BusyBox),
|
|
||||||
parse_less_version_busybox(output)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_parse_less_version_invalid_utf_8() {
|
|
||||||
let output = b"\xff";
|
|
||||||
|
|
||||||
assert_eq!(None, parse_less_version(output));
|
|
||||||
assert_eq!(None, parse_less_version_busybox(output));
|
|
||||||
}
|
}
|
||||||
|
@@ -35,7 +35,6 @@ pub mod error;
|
|||||||
pub mod input;
|
pub mod input;
|
||||||
mod less;
|
mod less;
|
||||||
pub mod line_range;
|
pub mod line_range;
|
||||||
pub(crate) mod nonprintable_notation;
|
|
||||||
mod output;
|
mod output;
|
||||||
#[cfg(feature = "paging")]
|
#[cfg(feature = "paging")]
|
||||||
mod pager;
|
mod pager;
|
||||||
@@ -50,8 +49,7 @@ mod terminal;
|
|||||||
mod vscreen;
|
mod vscreen;
|
||||||
pub(crate) mod wrapping;
|
pub(crate) mod wrapping;
|
||||||
|
|
||||||
pub use nonprintable_notation::NonprintableNotation;
|
pub use pretty_printer::{Input, PrettyPrinter};
|
||||||
pub use pretty_printer::{Input, PrettyPrinter, Syntax};
|
|
||||||
pub use syntax_mapping::{MappingTarget, SyntaxMapping};
|
pub use syntax_mapping::{MappingTarget, SyntaxMapping};
|
||||||
pub use wrapping::WrappingMode;
|
pub use wrapping::WrappingMode;
|
||||||
|
|
||||||
|
@@ -168,7 +168,7 @@ fn test_parse_minus_fail() {
|
|||||||
assert!(range.is_err());
|
assert!(range.is_err());
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
|
#[derive(Copy, Clone, Debug, PartialEq)]
|
||||||
pub enum RangeCheckResult {
|
pub enum RangeCheckResult {
|
||||||
// Within one of the given ranges
|
// Within one of the given ranges
|
||||||
InRange,
|
InRange,
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
#[macro_export]
|
#[macro_export]
|
||||||
macro_rules! bat_warning {
|
macro_rules! bat_warning {
|
||||||
($($arg:tt)*) => ({
|
($($arg:tt)*) => ({
|
||||||
use nu_ansi_term::Color::Yellow;
|
use ansi_term::Colour::Yellow;
|
||||||
eprintln!("{}: {}", Yellow.paint("[bat warning]"), format!($($arg)*));
|
eprintln!("{}: {}", Yellow.paint("[bat warning]"), format!($($arg)*));
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@@ -1,12 +0,0 @@
|
|||||||
/// How to print non-printable characters with
|
|
||||||
/// [crate::config::Config::show_nonprintable]
|
|
||||||
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
|
|
||||||
#[non_exhaustive]
|
|
||||||
pub enum NonprintableNotation {
|
|
||||||
/// Use caret notation (^G, ^J, ^@, ..)
|
|
||||||
Caret,
|
|
||||||
|
|
||||||
/// Use unicode notation (␇, ␊, ␀, ..)
|
|
||||||
#[default]
|
|
||||||
Unicode,
|
|
||||||
}
|
|
@@ -4,7 +4,7 @@ use std::process::Child;
|
|||||||
|
|
||||||
use crate::error::*;
|
use crate::error::*;
|
||||||
#[cfg(feature = "paging")]
|
#[cfg(feature = "paging")]
|
||||||
use crate::less::{retrieve_less_version, LessVersion};
|
use crate::less::retrieve_less_version;
|
||||||
#[cfg(feature = "paging")]
|
#[cfg(feature = "paging")]
|
||||||
use crate::paging::PagingMode;
|
use crate::paging::PagingMode;
|
||||||
#[cfg(feature = "paging")]
|
#[cfg(feature = "paging")]
|
||||||
@@ -83,13 +83,13 @@ impl OutputType {
|
|||||||
let replace_arguments_to_less = pager.source == PagerSource::EnvVarPager;
|
let replace_arguments_to_less = pager.source == PagerSource::EnvVarPager;
|
||||||
|
|
||||||
if args.is_empty() || replace_arguments_to_less {
|
if args.is_empty() || replace_arguments_to_less {
|
||||||
p.arg("-R"); // Short version of --RAW-CONTROL-CHARS for maximum compatibility
|
p.arg("--RAW-CONTROL-CHARS");
|
||||||
if single_screen_action == SingleScreenAction::Quit {
|
if single_screen_action == SingleScreenAction::Quit {
|
||||||
p.arg("-F"); // Short version of --quit-if-one-screen for compatibility
|
p.arg("--quit-if-one-screen");
|
||||||
}
|
}
|
||||||
|
|
||||||
if wrapping_mode == WrappingMode::NoWrapping(true) {
|
if wrapping_mode == WrappingMode::NoWrapping(true) {
|
||||||
p.arg("-S"); // Short version of --chop-long-lines for compatibility
|
p.arg("--chop-long-lines");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Passing '--no-init' fixes a bug with '--quit-if-one-screen' in older
|
// Passing '--no-init' fixes a bug with '--quit-if-one-screen' in older
|
||||||
@@ -103,9 +103,7 @@ impl OutputType {
|
|||||||
None => {
|
None => {
|
||||||
p.arg("--no-init");
|
p.arg("--no-init");
|
||||||
}
|
}
|
||||||
Some(LessVersion::Less(version))
|
Some(version) if (version < 530 || (cfg!(windows) && version < 558)) => {
|
||||||
if (version < 530 || (cfg!(windows) && version < 558)) =>
|
|
||||||
{
|
|
||||||
p.arg("--no-init");
|
p.arg("--no-init");
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
|
20
src/pager.rs
20
src/pager.rs
@@ -40,23 +40,15 @@ impl PagerKind {
|
|||||||
fn from_bin(bin: &str) -> PagerKind {
|
fn from_bin(bin: &str) -> PagerKind {
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
|
|
||||||
// Set to `less` by default on most Linux distros.
|
match Path::new(bin)
|
||||||
let pager_bin = Path::new(bin).file_stem();
|
.file_stem()
|
||||||
|
.map(|s| s.to_string_lossy())
|
||||||
// The name of the current running binary. Normally `bat` but sometimes
|
.as_deref()
|
||||||
// `batcat` for compatibility reasons.
|
{
|
||||||
let current_bin = env::args_os().next();
|
Some("bat") => PagerKind::Bat,
|
||||||
|
|
||||||
// Check if the current running binary is set to be our pager.
|
|
||||||
let is_current_bin_pager = current_bin
|
|
||||||
.map(|s| Path::new(&s).file_stem() == pager_bin)
|
|
||||||
.unwrap_or(false);
|
|
||||||
|
|
||||||
match pager_bin.map(|s| s.to_string_lossy()).as_deref() {
|
|
||||||
Some("less") => PagerKind::Less,
|
Some("less") => PagerKind::Less,
|
||||||
Some("more") => PagerKind::More,
|
Some("more") => PagerKind::More,
|
||||||
Some("most") => PagerKind::Most,
|
Some("most") => PagerKind::Most,
|
||||||
_ if is_current_bin_pager => PagerKind::Bat,
|
|
||||||
_ => PagerKind::Unknown,
|
_ => PagerKind::Unknown,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,7 +1,12 @@
|
|||||||
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
|
#[derive(Debug, Clone, Copy, PartialEq)]
|
||||||
pub enum PagingMode {
|
pub enum PagingMode {
|
||||||
Always,
|
Always,
|
||||||
QuitIfOneScreen,
|
QuitIfOneScreen,
|
||||||
#[default]
|
|
||||||
Never,
|
Never,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Default for PagingMode {
|
||||||
|
fn default() -> Self {
|
||||||
|
PagingMode::Never
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -1,9 +1,5 @@
|
|||||||
use std::fmt::Write;
|
|
||||||
|
|
||||||
use console::AnsiCodeIterator;
|
use console::AnsiCodeIterator;
|
||||||
|
|
||||||
use crate::nonprintable_notation::NonprintableNotation;
|
|
||||||
|
|
||||||
/// Expand tabs like an ANSI-enabled expand(1).
|
/// Expand tabs like an ANSI-enabled expand(1).
|
||||||
pub fn expand_tabs(line: &str, width: usize, cursor: &mut usize) -> String {
|
pub fn expand_tabs(line: &str, width: usize, cursor: &mut usize) -> String {
|
||||||
let mut buffer = String::with_capacity(line.len() * 2);
|
let mut buffer = String::with_capacity(line.len() * 2);
|
||||||
@@ -22,7 +18,7 @@ pub fn expand_tabs(line: &str, width: usize, cursor: &mut usize) -> String {
|
|||||||
// Add tab.
|
// Add tab.
|
||||||
let spaces = width - (*cursor % width);
|
let spaces = width - (*cursor % width);
|
||||||
*cursor += spaces;
|
*cursor += spaces;
|
||||||
buffer.push_str(&" ".repeat(spaces));
|
buffer.push_str(&*" ".repeat(spaces));
|
||||||
|
|
||||||
// Next.
|
// Next.
|
||||||
text = &text[index + 1..text.len()];
|
text = &text[index + 1..text.len()];
|
||||||
@@ -51,71 +47,42 @@ fn try_parse_utf8_char(input: &[u8]) -> Option<(char, usize)> {
|
|||||||
decoded.map(|(seq, n)| (seq.chars().next().unwrap(), n))
|
decoded.map(|(seq, n)| (seq.chars().next().unwrap(), n))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn replace_nonprintable(
|
pub fn replace_nonprintable(input: &[u8], tab_width: usize) -> String {
|
||||||
input: &[u8],
|
|
||||||
tab_width: usize,
|
|
||||||
nonprintable_notation: NonprintableNotation,
|
|
||||||
) -> String {
|
|
||||||
let mut output = String::new();
|
let mut output = String::new();
|
||||||
|
|
||||||
let tab_width = if tab_width == 0 { 4 } else { tab_width };
|
let tab_width = if tab_width == 0 { 4 } else { tab_width };
|
||||||
|
|
||||||
let mut idx = 0;
|
let mut idx = 0;
|
||||||
let mut line_idx = 0;
|
|
||||||
let len = input.len();
|
let len = input.len();
|
||||||
while idx < len {
|
while idx < len {
|
||||||
if let Some((chr, skip_ahead)) = try_parse_utf8_char(&input[idx..]) {
|
if let Some((chr, skip_ahead)) = try_parse_utf8_char(&input[idx..]) {
|
||||||
idx += skip_ahead;
|
idx += skip_ahead;
|
||||||
line_idx += 1;
|
|
||||||
|
|
||||||
match chr {
|
match chr {
|
||||||
// space
|
// space
|
||||||
' ' => output.push('·'),
|
' ' => output.push('·'),
|
||||||
// tab
|
// tab
|
||||||
'\t' => {
|
'\t' => {
|
||||||
let tab_stop = tab_width - ((line_idx - 1) % tab_width);
|
if tab_width == 1 {
|
||||||
line_idx = 0;
|
|
||||||
if tab_stop == 1 {
|
|
||||||
output.push('↹');
|
output.push('↹');
|
||||||
} else {
|
} else {
|
||||||
output.push('├');
|
output.push('├');
|
||||||
output.push_str(&"─".repeat(tab_stop - 2));
|
output.push_str(&"─".repeat(tab_width - 2));
|
||||||
output.push('┤');
|
output.push('┤');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// line feed
|
// line feed
|
||||||
'\x0A' => {
|
'\x0A' => output.push_str("␊\x0A"),
|
||||||
output.push_str(match nonprintable_notation {
|
|
||||||
NonprintableNotation::Caret => "^J\x0A",
|
|
||||||
NonprintableNotation::Unicode => "␊\x0A",
|
|
||||||
});
|
|
||||||
line_idx = 0;
|
|
||||||
}
|
|
||||||
// carriage return
|
// carriage return
|
||||||
'\x0D' => output.push_str(match nonprintable_notation {
|
'\x0D' => output.push('␍'),
|
||||||
NonprintableNotation::Caret => "^M",
|
|
||||||
NonprintableNotation::Unicode => "␍",
|
|
||||||
}),
|
|
||||||
// null
|
// null
|
||||||
'\x00' => output.push_str(match nonprintable_notation {
|
'\x00' => output.push('␀'),
|
||||||
NonprintableNotation::Caret => "^@",
|
|
||||||
NonprintableNotation::Unicode => "␀",
|
|
||||||
}),
|
|
||||||
// bell
|
// bell
|
||||||
'\x07' => output.push_str(match nonprintable_notation {
|
'\x07' => output.push('␇'),
|
||||||
NonprintableNotation::Caret => "^G",
|
|
||||||
NonprintableNotation::Unicode => "␇",
|
|
||||||
}),
|
|
||||||
// backspace
|
// backspace
|
||||||
'\x08' => output.push_str(match nonprintable_notation {
|
'\x08' => output.push('␈'),
|
||||||
NonprintableNotation::Caret => "^H",
|
|
||||||
NonprintableNotation::Unicode => "␈",
|
|
||||||
}),
|
|
||||||
// escape
|
// escape
|
||||||
'\x1B' => output.push_str(match nonprintable_notation {
|
'\x1B' => output.push('␛'),
|
||||||
NonprintableNotation::Caret => "^[",
|
|
||||||
NonprintableNotation::Unicode => "␛",
|
|
||||||
}),
|
|
||||||
// printable ASCII
|
// printable ASCII
|
||||||
c if c.is_ascii_alphanumeric()
|
c if c.is_ascii_alphanumeric()
|
||||||
|| c.is_ascii_punctuation()
|
|| c.is_ascii_punctuation()
|
||||||
@@ -127,7 +94,7 @@ pub fn replace_nonprintable(
|
|||||||
c => output.push_str(&c.escape_unicode().collect::<String>()),
|
c => output.push_str(&c.escape_unicode().collect::<String>()),
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
write!(output, "\\x{:02X}", input[idx]).ok();
|
output.push_str(&format!("\\x{:02X}", input[idx]));
|
||||||
idx += 1;
|
idx += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -2,6 +2,7 @@ use std::io::Read;
|
|||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
|
|
||||||
use console::Term;
|
use console::Term;
|
||||||
|
use syntect::parsing::SyntaxReference;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
assets::HighlightingAssets,
|
assets::HighlightingAssets,
|
||||||
@@ -10,7 +11,7 @@ use crate::{
|
|||||||
error::Result,
|
error::Result,
|
||||||
input,
|
input,
|
||||||
line_range::{HighlightedLineRanges, LineRange, LineRanges},
|
line_range::{HighlightedLineRanges, LineRange, LineRanges},
|
||||||
style::StyleComponent,
|
style::{StyleComponent, StyleComponents},
|
||||||
SyntaxMapping, WrappingMode,
|
SyntaxMapping, WrappingMode,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -19,8 +20,7 @@ use crate::paging::PagingMode;
|
|||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
struct ActiveStyleComponents {
|
struct ActiveStyleComponents {
|
||||||
header_filename: bool,
|
header: bool,
|
||||||
#[cfg(feature = "git")]
|
|
||||||
vcs_modification_markers: bool,
|
vcs_modification_markers: bool,
|
||||||
grid: bool,
|
grid: bool,
|
||||||
rule: bool,
|
rule: bool,
|
||||||
@@ -28,12 +28,6 @@ struct ActiveStyleComponents {
|
|||||||
snip: bool,
|
snip: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[non_exhaustive]
|
|
||||||
pub struct Syntax {
|
|
||||||
pub name: String,
|
|
||||||
pub file_extensions: Vec<String>,
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct PrettyPrinter<'a> {
|
pub struct PrettyPrinter<'a> {
|
||||||
inputs: Vec<Input<'a>>,
|
inputs: Vec<Input<'a>>,
|
||||||
config: Config<'a>,
|
config: Config<'a>,
|
||||||
@@ -140,7 +134,7 @@ impl<'a> PrettyPrinter<'a> {
|
|||||||
|
|
||||||
/// Whether to show a header with the file name
|
/// Whether to show a header with the file name
|
||||||
pub fn header(&mut self, yes: bool) -> &mut Self {
|
pub fn header(&mut self, yes: bool) -> &mut Self {
|
||||||
self.active_style_components.header_filename = yes;
|
self.active_style_components.header = yes;
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -170,12 +164,6 @@ impl<'a> PrettyPrinter<'a> {
|
|||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Whether to print binary content or nonprintable characters (default: no)
|
|
||||||
pub fn show_nonprintable(&mut self, yes: bool) -> &mut Self {
|
|
||||||
self.config.show_nonprintable = yes;
|
|
||||||
self
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Whether to show "snip" markers between visible line ranges (default: no)
|
/// Whether to show "snip" markers between visible line ranges (default: no)
|
||||||
pub fn snip(&mut self, yes: bool) -> &mut Self {
|
pub fn snip(&mut self, yes: bool) -> &mut Self {
|
||||||
self.active_style_components.snip = yes;
|
self.active_style_components.snip = yes;
|
||||||
@@ -246,57 +234,47 @@ impl<'a> PrettyPrinter<'a> {
|
|||||||
self.assets.themes()
|
self.assets.themes()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn syntaxes(&self) -> impl Iterator<Item = Syntax> + '_ {
|
pub fn syntaxes(&self) -> impl Iterator<Item = &SyntaxReference> {
|
||||||
// We always use assets from the binary, which are guaranteed to always
|
// We always use assets from the binary, which are guaranteed to always
|
||||||
// be valid, so get_syntaxes() can never fail here
|
// be valid, so get_syntaxes() can never fail here
|
||||||
self.assets
|
self.assets.get_syntaxes().unwrap().iter()
|
||||||
.get_syntaxes()
|
|
||||||
.unwrap()
|
|
||||||
.iter()
|
|
||||||
.filter(|s| !s.hidden)
|
|
||||||
.map(|s| Syntax {
|
|
||||||
name: s.name.clone(),
|
|
||||||
file_extensions: s.file_extensions.clone(),
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Pretty-print all specified inputs. This method will "use" all stored inputs.
|
/// Pretty-print all specified inputs. This method will "use" all stored inputs.
|
||||||
/// If you want to call 'print' multiple times, you have to call the appropriate
|
/// If you want to call 'print' multiple times, you have to call the appropriate
|
||||||
/// input_* methods again.
|
/// input_* methods again.
|
||||||
pub fn print(&mut self) -> Result<bool> {
|
pub fn print(&mut self) -> Result<bool> {
|
||||||
let highlight_lines = std::mem::take(&mut self.highlighted_lines);
|
self.config.highlighted_lines =
|
||||||
self.config.highlighted_lines = HighlightedLineRanges(LineRanges::from(highlight_lines));
|
HighlightedLineRanges(LineRanges::from(self.highlighted_lines.clone()));
|
||||||
self.config.term_width = self
|
self.config.term_width = self
|
||||||
.term_width
|
.term_width
|
||||||
.unwrap_or_else(|| Term::stdout().size().1 as usize);
|
.unwrap_or_else(|| Term::stdout().size().1 as usize);
|
||||||
|
|
||||||
self.config.style_components.clear();
|
let mut style_components = vec![];
|
||||||
if self.active_style_components.grid {
|
if self.active_style_components.grid {
|
||||||
self.config.style_components.insert(StyleComponent::Grid);
|
style_components.push(StyleComponent::Grid);
|
||||||
}
|
}
|
||||||
if self.active_style_components.rule {
|
if self.active_style_components.rule {
|
||||||
self.config.style_components.insert(StyleComponent::Rule);
|
style_components.push(StyleComponent::Rule);
|
||||||
}
|
}
|
||||||
if self.active_style_components.header_filename {
|
if self.active_style_components.header {
|
||||||
self.config
|
style_components.push(StyleComponent::Header);
|
||||||
.style_components
|
|
||||||
.insert(StyleComponent::HeaderFilename);
|
|
||||||
}
|
}
|
||||||
if self.active_style_components.line_numbers {
|
if self.active_style_components.line_numbers {
|
||||||
self.config
|
style_components.push(StyleComponent::LineNumbers);
|
||||||
.style_components
|
|
||||||
.insert(StyleComponent::LineNumbers);
|
|
||||||
}
|
}
|
||||||
if self.active_style_components.snip {
|
if self.active_style_components.snip {
|
||||||
self.config.style_components.insert(StyleComponent::Snip);
|
style_components.push(StyleComponent::Snip);
|
||||||
}
|
}
|
||||||
#[cfg(feature = "git")]
|
|
||||||
if self.active_style_components.vcs_modification_markers {
|
if self.active_style_components.vcs_modification_markers {
|
||||||
self.config.style_components.insert(StyleComponent::Changes);
|
#[cfg(feature = "git")]
|
||||||
|
style_components.push(StyleComponent::Changes);
|
||||||
}
|
}
|
||||||
|
self.config.style_components = StyleComponents::new(&style_components);
|
||||||
|
|
||||||
// Collect the inputs to print
|
// Collect the inputs to print
|
||||||
let inputs = std::mem::take(&mut self.inputs);
|
let mut inputs: Vec<Input> = vec![];
|
||||||
|
std::mem::swap(&mut inputs, &mut self.inputs);
|
||||||
|
|
||||||
// Run the controller
|
// Run the controller
|
||||||
let controller = Controller::new(&self.config, &self.assets);
|
let controller = Controller::new(&self.config, &self.assets);
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
use std::io::Write;
|
use std::io::Write;
|
||||||
use std::vec::Vec;
|
use std::vec::Vec;
|
||||||
|
|
||||||
use nu_ansi_term::Color::{Fixed, Green, Red, Yellow};
|
use ansi_term::Colour::{Fixed, Green, Red, Yellow};
|
||||||
use nu_ansi_term::Style;
|
use ansi_term::Style;
|
||||||
|
|
||||||
use bytesize::ByteSize;
|
use bytesize::ByteSize;
|
||||||
|
|
||||||
@@ -93,11 +93,7 @@ impl<'a> Printer for SimplePrinter<'a> {
|
|||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
if !out_of_range {
|
if !out_of_range {
|
||||||
if self.config.show_nonprintable {
|
if self.config.show_nonprintable {
|
||||||
let line = replace_nonprintable(
|
let line = replace_nonprintable(line_buffer, self.config.tab_width);
|
||||||
line_buffer,
|
|
||||||
self.config.tab_width,
|
|
||||||
self.config.nonprintable_notation,
|
|
||||||
);
|
|
||||||
write!(handle, "{}", line)?;
|
write!(handle, "{}", line)?;
|
||||||
} else {
|
} else {
|
||||||
handle.write_all(line_buffer)?
|
handle.write_all(line_buffer)?
|
||||||
@@ -426,13 +422,9 @@ impl<'a> Printer for InteractivePrinter<'a> {
|
|||||||
line_buffer: &[u8],
|
line_buffer: &[u8],
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
let line = if self.config.show_nonprintable {
|
let line = if self.config.show_nonprintable {
|
||||||
replace_nonprintable(
|
replace_nonprintable(line_buffer, self.config.tab_width)
|
||||||
line_buffer,
|
|
||||||
self.config.tab_width,
|
|
||||||
self.config.nonprintable_notation,
|
|
||||||
)
|
|
||||||
} else {
|
} else {
|
||||||
let line = match self.content_type {
|
match self.content_type {
|
||||||
Some(ContentType::BINARY) | None => {
|
Some(ContentType::BINARY) | None => {
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
@@ -443,15 +435,6 @@ impl<'a> Printer for InteractivePrinter<'a> {
|
|||||||
.decode(line_buffer, DecoderTrap::Replace)
|
.decode(line_buffer, DecoderTrap::Replace)
|
||||||
.map_err(|_| "Invalid UTF-16BE")?,
|
.map_err(|_| "Invalid UTF-16BE")?,
|
||||||
_ => String::from_utf8_lossy(line_buffer).to_string(),
|
_ => String::from_utf8_lossy(line_buffer).to_string(),
|
||||||
};
|
|
||||||
// Remove byte order mark from the first line if it exists
|
|
||||||
if line_number == 1 {
|
|
||||||
match line.strip_prefix('\u{feff}') {
|
|
||||||
Some(stripped) => stripped.to_string(),
|
|
||||||
None => line,
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
line
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -462,21 +445,9 @@ impl<'a> Printer for InteractivePrinter<'a> {
|
|||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
highlighter_from_set
|
||||||
// skip syntax highlighting on long lines
|
|
||||||
let too_long = line.len() > 1024 * 16;
|
|
||||||
|
|
||||||
let for_highlighting: &str = if too_long { "\n" } else { &line };
|
|
||||||
|
|
||||||
let mut highlighted_line = highlighter_from_set
|
|
||||||
.highlighter
|
.highlighter
|
||||||
.highlight_line(for_highlighting, highlighter_from_set.syntax_set)?;
|
.highlight(&line, highlighter_from_set.syntax_set)
|
||||||
|
|
||||||
if too_long {
|
|
||||||
highlighted_line[0].1 = &line;
|
|
||||||
}
|
|
||||||
|
|
||||||
highlighted_line
|
|
||||||
};
|
};
|
||||||
|
|
||||||
if out_of_range {
|
if out_of_range {
|
||||||
@@ -492,10 +463,6 @@ impl<'a> Printer for InteractivePrinter<'a> {
|
|||||||
let highlight_this_line =
|
let highlight_this_line =
|
||||||
self.config.highlighted_lines.0.check(line_number) == RangeCheckResult::InRange;
|
self.config.highlighted_lines.0.check(line_number) == RangeCheckResult::InRange;
|
||||||
|
|
||||||
if highlight_this_line && self.config.theme == "ansi" {
|
|
||||||
self.ansi_style.update("^[4m");
|
|
||||||
}
|
|
||||||
|
|
||||||
let background_color = self
|
let background_color = self
|
||||||
.background_color_highlight
|
.background_color_highlight
|
||||||
.filter(|_| highlight_this_line);
|
.filter(|_| highlight_this_line);
|
||||||
@@ -629,7 +596,7 @@ impl<'a> Printer for InteractivePrinter<'a> {
|
|||||||
"{}\n{}",
|
"{}\n{}",
|
||||||
as_terminal_escaped(
|
as_terminal_escaped(
|
||||||
style,
|
style,
|
||||||
&format!("{}{}", self.ansi_style, line_buf),
|
&*format!("{}{}", self.ansi_style, line_buf),
|
||||||
self.config.true_color,
|
self.config.true_color,
|
||||||
self.config.colored_output,
|
self.config.colored_output,
|
||||||
self.config.use_italic_text,
|
self.config.use_italic_text,
|
||||||
@@ -655,7 +622,7 @@ impl<'a> Printer for InteractivePrinter<'a> {
|
|||||||
"{}",
|
"{}",
|
||||||
as_terminal_escaped(
|
as_terminal_escaped(
|
||||||
style,
|
style,
|
||||||
&format!("{}{}", self.ansi_style, line_buf),
|
&*format!("{}{}", self.ansi_style, line_buf),
|
||||||
self.config.true_color,
|
self.config.true_color,
|
||||||
self.config.colored_output,
|
self.config.colored_output,
|
||||||
self.config.use_italic_text,
|
self.config.use_italic_text,
|
||||||
@@ -682,11 +649,6 @@ impl<'a> Printer for InteractivePrinter<'a> {
|
|||||||
writeln!(handle)?;
|
writeln!(handle)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
if highlight_this_line && self.config.theme == "ansi" {
|
|
||||||
self.ansi_style.update("^[24m");
|
|
||||||
write!(handle, "\x1B[24m")?;
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
20
src/style.rs
20
src/style.rs
@@ -17,7 +17,6 @@ pub enum StyleComponent {
|
|||||||
LineNumbers,
|
LineNumbers,
|
||||||
Snip,
|
Snip,
|
||||||
Full,
|
Full,
|
||||||
Default,
|
|
||||||
Plain,
|
Plain,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -26,7 +25,7 @@ impl StyleComponent {
|
|||||||
match self {
|
match self {
|
||||||
StyleComponent::Auto => {
|
StyleComponent::Auto => {
|
||||||
if interactive_terminal {
|
if interactive_terminal {
|
||||||
StyleComponent::Default.components(interactive_terminal)
|
StyleComponent::Full.components(interactive_terminal)
|
||||||
} else {
|
} else {
|
||||||
StyleComponent::Plain.components(interactive_terminal)
|
StyleComponent::Plain.components(interactive_terminal)
|
||||||
}
|
}
|
||||||
@@ -49,14 +48,6 @@ impl StyleComponent {
|
|||||||
StyleComponent::LineNumbers,
|
StyleComponent::LineNumbers,
|
||||||
StyleComponent::Snip,
|
StyleComponent::Snip,
|
||||||
],
|
],
|
||||||
StyleComponent::Default => &[
|
|
||||||
#[cfg(feature = "git")]
|
|
||||||
StyleComponent::Changes,
|
|
||||||
StyleComponent::Grid,
|
|
||||||
StyleComponent::HeaderFilename,
|
|
||||||
StyleComponent::LineNumbers,
|
|
||||||
StyleComponent::Snip,
|
|
||||||
],
|
|
||||||
StyleComponent::Plain => &[],
|
StyleComponent::Plain => &[],
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -78,7 +69,6 @@ impl FromStr for StyleComponent {
|
|||||||
"numbers" => Ok(StyleComponent::LineNumbers),
|
"numbers" => Ok(StyleComponent::LineNumbers),
|
||||||
"snip" => Ok(StyleComponent::Snip),
|
"snip" => Ok(StyleComponent::Snip),
|
||||||
"full" => Ok(StyleComponent::Full),
|
"full" => Ok(StyleComponent::Full),
|
||||||
"default" => Ok(StyleComponent::Default),
|
|
||||||
"plain" => Ok(StyleComponent::Plain),
|
"plain" => Ok(StyleComponent::Plain),
|
||||||
_ => Err(format!("Unknown style '{}'", s).into()),
|
_ => Err(format!("Unknown style '{}'", s).into()),
|
||||||
}
|
}
|
||||||
@@ -129,12 +119,4 @@ impl StyleComponents {
|
|||||||
pub fn plain(&self) -> bool {
|
pub fn plain(&self) -> bool {
|
||||||
self.0.iter().all(|c| c == &StyleComponent::Plain)
|
self.0.iter().all(|c| c == &StyleComponent::Plain)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn insert(&mut self, component: StyleComponent) {
|
|
||||||
self.0.insert(component);
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn clear(&mut self) {
|
|
||||||
self.0.clear();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@@ -7,7 +7,7 @@ use globset::{Candidate, GlobBuilder, GlobMatcher};
|
|||||||
|
|
||||||
pub mod ignored_suffixes;
|
pub mod ignored_suffixes;
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
#[derive(Debug, Clone, Copy, PartialEq)]
|
||||||
#[non_exhaustive]
|
#[non_exhaustive]
|
||||||
pub enum MappingTarget<'a> {
|
pub enum MappingTarget<'a> {
|
||||||
/// For mapping a path to a specific syntax.
|
/// For mapping a path to a specific syntax.
|
||||||
@@ -41,9 +41,6 @@ impl<'a> SyntaxMapping<'a> {
|
|||||||
pub fn builtin() -> SyntaxMapping<'a> {
|
pub fn builtin() -> SyntaxMapping<'a> {
|
||||||
let mut mapping = Self::empty();
|
let mut mapping = Self::empty();
|
||||||
mapping.insert("*.h", MappingTarget::MapTo("C++")).unwrap();
|
mapping.insert("*.h", MappingTarget::MapTo("C++")).unwrap();
|
||||||
mapping
|
|
||||||
.insert(".clang-format", MappingTarget::MapTo("YAML"))
|
|
||||||
.unwrap();
|
|
||||||
mapping.insert("*.fs", MappingTarget::MapTo("F#")).unwrap();
|
mapping.insert("*.fs", MappingTarget::MapTo("F#")).unwrap();
|
||||||
mapping
|
mapping
|
||||||
.insert("build", MappingTarget::MapToUnknown)
|
.insert("build", MappingTarget::MapToUnknown)
|
||||||
@@ -66,14 +63,6 @@ impl<'a> SyntaxMapping<'a> {
|
|||||||
mapping
|
mapping
|
||||||
.insert("*.pac", MappingTarget::MapTo("JavaScript (Babel)"))
|
.insert("*.pac", MappingTarget::MapTo("JavaScript (Babel)"))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
mapping
|
|
||||||
.insert("fish_history", MappingTarget::MapTo("YAML"))
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
// See #2151, https://nmap.org/book/nse-language.html
|
|
||||||
mapping
|
|
||||||
.insert("*.nse", MappingTarget::MapTo("Lua"))
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
// See #1008
|
// See #1008
|
||||||
mapping
|
mapping
|
||||||
@@ -128,32 +117,13 @@ impl<'a> SyntaxMapping<'a> {
|
|||||||
mapping.insert(glob, MappingTarget::MapTo("INI")).unwrap();
|
mapping.insert(glob, MappingTarget::MapTo("INI")).unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
// unix mail spool
|
|
||||||
for glob in &["/var/spool/mail/*", "/var/mail/*"] {
|
|
||||||
mapping.insert(glob, MappingTarget::MapTo("Email")).unwrap()
|
|
||||||
}
|
|
||||||
|
|
||||||
// pacman hooks
|
// pacman hooks
|
||||||
mapping
|
mapping
|
||||||
.insert("*.hook", MappingTarget::MapTo("INI"))
|
.insert("*.hook", MappingTarget::MapTo("INI"))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
// Global git config files rooted in `$XDG_CONFIG_HOME/git/` or `$HOME/.config/git/`
|
if let Some(xdg_config_home) = std::env::var_os("XDG_CONFIG_HOME") {
|
||||||
// See e.g. https://git-scm.com/docs/git-config#FILES
|
let git_config_path = Path::new(&xdg_config_home).join("git");
|
||||||
if let Some(xdg_config_home) =
|
|
||||||
std::env::var_os("XDG_CONFIG_HOME").filter(|val| !val.is_empty())
|
|
||||||
{
|
|
||||||
insert_git_config_global(&mut mapping, &xdg_config_home);
|
|
||||||
}
|
|
||||||
if let Some(default_config_home) = std::env::var_os("HOME")
|
|
||||||
.filter(|val| !val.is_empty())
|
|
||||||
.map(|home| Path::new(&home).join(".config"))
|
|
||||||
{
|
|
||||||
insert_git_config_global(&mut mapping, &default_config_home);
|
|
||||||
}
|
|
||||||
|
|
||||||
fn insert_git_config_global(mapping: &mut SyntaxMapping, config_home: impl AsRef<Path>) {
|
|
||||||
let git_config_path = config_home.as_ref().join("git");
|
|
||||||
|
|
||||||
mapping
|
mapping
|
||||||
.insert(
|
.insert(
|
||||||
@@ -194,7 +164,6 @@ impl<'a> SyntaxMapping<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn get_syntax_for(&self, path: impl AsRef<Path>) -> Option<MappingTarget<'a>> {
|
pub(crate) fn get_syntax_for(&self, path: impl AsRef<Path>) -> Option<MappingTarget<'a>> {
|
||||||
// Try matching on the file name as-is.
|
|
||||||
let candidate = Candidate::new(&path);
|
let candidate = Candidate::new(&path);
|
||||||
let candidate_filename = path.as_ref().file_name().map(Candidate::new);
|
let candidate_filename = path.as_ref().file_name().map(Candidate::new);
|
||||||
for (ref glob, ref syntax) in self.mappings.iter().rev() {
|
for (ref glob, ref syntax) in self.mappings.iter().rev() {
|
||||||
@@ -206,13 +175,7 @@ impl<'a> SyntaxMapping<'a> {
|
|||||||
return Some(*syntax);
|
return Some(*syntax);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Try matching on the file name after removing an ignored suffix.
|
None
|
||||||
let file_name = path.as_ref().file_name()?;
|
|
||||||
self.ignored_suffixes
|
|
||||||
.try_with_stripped_suffix(file_name, |stripped_file_name| {
|
|
||||||
Ok(self.get_syntax_for(stripped_file_name))
|
|
||||||
})
|
|
||||||
.ok()?
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn insert_ignored_suffix(&mut self, suffix: &'a str) {
|
pub fn insert_ignored_suffix(&mut self, suffix: &'a str) {
|
||||||
|
@@ -1,9 +1,9 @@
|
|||||||
use nu_ansi_term::Color::{self, Fixed, Rgb};
|
use ansi_term::Color::{self, Fixed, RGB};
|
||||||
use nu_ansi_term::{self, Style};
|
use ansi_term::{self, Style};
|
||||||
|
|
||||||
use syntect::highlighting::{self, FontStyle};
|
use syntect::highlighting::{self, FontStyle};
|
||||||
|
|
||||||
pub fn to_ansi_color(color: highlighting::Color, true_color: bool) -> Option<nu_ansi_term::Color> {
|
pub fn to_ansi_color(color: highlighting::Color, true_color: bool) -> Option<ansi_term::Color> {
|
||||||
if color.a == 0 {
|
if color.a == 0 {
|
||||||
// Themes can specify one of the user-configurable terminal colors by
|
// Themes can specify one of the user-configurable terminal colors by
|
||||||
// encoding them as #RRGGBBAA with AA set to 00 (transparent) and RR set
|
// encoding them as #RRGGBBAA with AA set to 00 (transparent) and RR set
|
||||||
@@ -38,7 +38,7 @@ pub fn to_ansi_color(color: highlighting::Color, true_color: bool) -> Option<nu_
|
|||||||
// 01. The built-in theme ansi uses this.
|
// 01. The built-in theme ansi uses this.
|
||||||
None
|
None
|
||||||
} else if true_color {
|
} else if true_color {
|
||||||
Some(Rgb(color.r, color.g, color.b))
|
Some(RGB(color.r, color.g, color.b))
|
||||||
} else {
|
} else {
|
||||||
Some(Fixed(ansi_colours::ansi256_from_rgb((
|
Some(Fixed(ansi_colours::ansi256_from_rgb((
|
||||||
color.r, color.g, color.b,
|
color.r, color.g, color.b,
|
||||||
|
1
tests/examples/bat-tabs.conf
vendored
1
tests/examples/bat-tabs.conf
vendored
@@ -1 +0,0 @@
|
|||||||
--tabs=8
|
|
1
tests/examples/bat-theme.conf
vendored
1
tests/examples/bat-theme.conf
vendored
@@ -1 +0,0 @@
|
|||||||
--theme=TwoDark
|
|
2
tests/examples/bat.conf
vendored
2
tests/examples/bat.conf
vendored
@@ -1,5 +1,5 @@
|
|||||||
# Make sure that the pager gets executed
|
# Make sure that the pager gets executed
|
||||||
--paging=always
|
--paging=always
|
||||||
|
|
||||||
# Output a dummy message for the integration test and system wide config test.
|
# Output a dummy message for the integration test.
|
||||||
--pager="echo dummy-pager-from-config"
|
--pager="echo dummy-pager-from-config"
|
||||||
|
@@ -1,10 +0,0 @@
|
|||||||
%YAML 1.2
|
|
||||||
---
|
|
||||||
name: C
|
|
||||||
file_extensions: [c, h]
|
|
||||||
scope: source.c
|
|
||||||
|
|
||||||
contexts:
|
|
||||||
main:
|
|
||||||
- match: \b(if|else|for|while)\b
|
|
||||||
scope: keyword.control.c
|
|
@@ -1,45 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
||||||
<plist version="1.0">
|
|
||||||
<dict>
|
|
||||||
<key>name</key>
|
|
||||||
<string>example</string>
|
|
||||||
<key>settings</key>
|
|
||||||
<array>
|
|
||||||
<dict>
|
|
||||||
<key>settings</key>
|
|
||||||
<dict>
|
|
||||||
<key>background</key>
|
|
||||||
<string>#222222</string>
|
|
||||||
<key>caret</key>
|
|
||||||
<string>#979797</string>
|
|
||||||
<key>foreground</key>
|
|
||||||
<string>#F8F8F8</string>
|
|
||||||
<key>invisibles</key>
|
|
||||||
<string>#777777</string>
|
|
||||||
<key>lineHighlight</key>
|
|
||||||
<string>#000000</string>
|
|
||||||
<key>selection</key>
|
|
||||||
<string>#57CCBF</string>
|
|
||||||
</dict>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>name</key>
|
|
||||||
<string>Comment</string>
|
|
||||||
<key>scope</key>
|
|
||||||
<string>comment</string>
|
|
||||||
<key>settings</key>
|
|
||||||
<dict>
|
|
||||||
<key>foreground</key>
|
|
||||||
<string>#777777</string>
|
|
||||||
</dict>
|
|
||||||
</dict>
|
|
||||||
</array>
|
|
||||||
<key>uuid</key>
|
|
||||||
<string>0123-4567-89AB-CDEF</string>
|
|
||||||
<key>colorSpaceName</key>
|
|
||||||
<string>sRGB</string>
|
|
||||||
<key>semanticClass</key>
|
|
||||||
<string>theme</string>
|
|
||||||
</dict>
|
|
||||||
</plist>
|
|
3
tests/examples/git/.config/git/config
vendored
3
tests/examples/git/.config/git/config
vendored
@@ -1,3 +0,0 @@
|
|||||||
[user]
|
|
||||||
email = foo@bar.net
|
|
||||||
name = foobar
|
|
3
tests/examples/git/.gitconfig
vendored
3
tests/examples/git/.gitconfig
vendored
@@ -1,3 +0,0 @@
|
|||||||
[user]
|
|
||||||
email = foo@bar.net
|
|
||||||
name = foobar
|
|
1
tests/examples/long-single-line.txt
vendored
1
tests/examples/long-single-line.txt
vendored
@@ -1 +0,0 @@
|
|||||||
abcdefghigklmnopqrstuvxyzabcdefghigklmnopqrstuvxyzabcdefghigklmnopqrstuvxyzabcdefghigklmnopqrstuvxyz
|
|
3
tests/examples/longline.json
vendored
3
tests/examples/longline.json
vendored
File diff suppressed because one or more lines are too long
5
tests/examples/system_config/bat/config
vendored
5
tests/examples/system_config/bat/config
vendored
@@ -1,5 +0,0 @@
|
|||||||
# Make sure that the pager gets executed
|
|
||||||
--paging=always
|
|
||||||
|
|
||||||
# Output a dummy message for the integration test.
|
|
||||||
--pager="echo dummy-pager-from-system-config"
|
|
1
tests/examples/test.demo.foo.suffix
vendored
1
tests/examples/test.demo.foo.suffix
vendored
@@ -1 +0,0 @@
|
|||||||
{"test": "value"}
|
|
1
tests/examples/test.demo.suffix
vendored
1
tests/examples/test.demo.suffix
vendored
@@ -1 +0,0 @@
|
|||||||
{"test": "value"}
|
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user