mirror of
https://github.com/sharkdp/bat.git
synced 2025-09-04 20:32:27 +01:00
Compare commits
6 Commits
v0.23.0
...
bat-plugin
Author | SHA1 | Date | |
---|---|---|---|
|
aa35cb52c4 | ||
|
446b9181e6 | ||
|
040242c9be | ||
|
dbf78d280a | ||
|
bc91af3ee5 | ||
|
3811615606 |
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
|
|
||||||
|
241
.github/workflows/CICD.yml
vendored
241
.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,37 @@ 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: Print -h
|
||||||
|
uses: actions-rs/cargo@v1
|
||||||
|
with:
|
||||||
|
command: run
|
||||||
|
args: --locked -- -h
|
||||||
|
- name: Print --help
|
||||||
|
uses: actions-rs/cargo@v1
|
||||||
|
with:
|
||||||
|
command: run
|
||||||
|
args: --locked -- --help
|
||||||
|
- name: Show man page
|
||||||
|
run: man $(find . -name bat.1)
|
||||||
- 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 }})
|
||||||
@@ -132,11 +156,9 @@ jobs:
|
|||||||
- { 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, use-cross: true }
|
||||||
- { 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 +177,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 +195,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 +211,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 +244,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 +309,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 +317,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 +340,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 +367,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 +446,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 +469,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
|
||||||
|
10
.gitmodules
vendored
10
.gitmodules
vendored
@@ -244,13 +244,3 @@
|
|||||||
url = https://github.com/victor-gp/cmd-help-sublime-syntax.git
|
url = https://github.com/victor-gp/cmd-help-sublime-syntax.git
|
||||||
branch = main
|
branch = main
|
||||||
shallow = true
|
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
|
|
||||||
|
65
CHANGELOG.md
65
CHANGELOG.md
@@ -1,82 +1,21 @@
|
|||||||
# 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
|
## Features
|
||||||
|
|
||||||
- Make the default macOS theme depend on Dark Mode. See #2197, #1746 (@Enselic)
|
- 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
|
## 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
|
## Other
|
||||||
|
|
||||||
- Relaxed glibc requirements on amd64, see #2106 and #2194 (@sharkdp)
|
- 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
|
## Syntaxes
|
||||||
|
|
||||||
- NSE (Nmap Scripting Engine) is mapped to Lua, see #2151 (@Cre3per)
|
## Themes
|
||||||
- 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
|
## `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
|
# v0.21.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
|
||||||
@@ -50,12 +50,12 @@ first.
|
|||||||
|
|
||||||
## Regression tests
|
## Regression tests
|
||||||
|
|
||||||
You are **strongly encouraged** to add regression tests. Regression tests are great,
|
You are strongly encouraged to add regression tests. Regression tests are great,
|
||||||
not least because they:
|
not least because they:
|
||||||
|
|
||||||
* ensure that your contribution will never completely stop working.
|
* ensure that your contribution will never completely stop working,
|
||||||
|
|
||||||
* makes code reviews easier, because it becomes very clear what the code is
|
* makes code review easier, because it becomes very clear what the code is
|
||||||
supposed to do.
|
supposed to do.
|
||||||
|
|
||||||
For functional changes, you most likely want to add a test to
|
For functional changes, you most likely want to add a test to
|
||||||
|
643
Cargo.lock
generated
643
Cargo.lock
generated
File diff suppressed because it is too large
Load Diff
50
Cargo.toml
50
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.21.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,10 +26,11 @@ application = [
|
|||||||
minimal-application = [
|
minimal-application = [
|
||||||
"atty",
|
"atty",
|
||||||
"clap",
|
"clap",
|
||||||
"dirs",
|
"dirs-next",
|
||||||
"paging",
|
"paging",
|
||||||
"regex-onig",
|
"regex-onig",
|
||||||
"wild",
|
"wild",
|
||||||
|
"rlua"
|
||||||
]
|
]
|
||||||
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
|
||||||
@@ -42,18 +42,18 @@ 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.10"
|
||||||
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.1.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"
|
||||||
@@ -61,14 +61,15 @@ 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.5.0", 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.5.5", optional = true }
|
||||||
walkdir = { version = "2.0", optional = true }
|
walkdir = { version = "2.0", optional = true }
|
||||||
bytesize = { version = "1.1.0" }
|
bytesize = { version = "1.1.0" }
|
||||||
|
rlua = { version = "0.19", optional = true }
|
||||||
|
|
||||||
[dependencies.git2]
|
[dependencies.git2]
|
||||||
version = "0.16"
|
version = "0.14"
|
||||||
optional = true
|
optional = true
|
||||||
default-features = false
|
default-features = false
|
||||||
|
|
||||||
@@ -78,31 +79,24 @@ 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.6.0"
|
serial_test = "0.6.0"
|
||||||
predicates = "2.1.5"
|
predicates = "2.1.1"
|
||||||
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 = { version = "0.24.1", default-features = false, features = ["term"] }
|
||||||
|
|
||||||
[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
|
||||||
|
10
README.md
10
README.md
@@ -367,7 +367,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 +418,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 +639,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 +797,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.
3
assets/completions/_bat.ps1.in
vendored
3
assets/completions/_bat.ps1.in
vendored
@@ -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' {
|
||||||
|
119
assets/completions/bat.bash.in
vendored
119
assets/completions/bat.bash.in
vendored
@@ -10,27 +10,6 @@ __bat_init_completion()
|
|||||||
_get_comp_words_by_ref "$@" cur prev words cword
|
_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=false
|
||||||
if declare -F _init_completion >/dev/null 2>&1; then
|
if declare -F _init_completion >/dev/null 2>&1; then
|
||||||
@@ -48,12 +27,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 +40,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 +74,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 "default auto full plain changes header header-filename header-filesize grid rule numbers snip" -d "Comma-separated list of style elements or presets to display with file contents" -n "not __fish_seen_subcommand_from cache"
|
||||||
|
|
||||||
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
|
|
||||||
|
26
assets/completions/bat.zsh.in
vendored
26
assets/completions/bat.zsh.in
vendored
@@ -80,14 +80,20 @@ _{{PROJECT_EXECUTABLE}}_main() {
|
|||||||
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
|
||||||
|
14
assets/manual/bat.1.in
vendored
14
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
|
||||||
|
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:
|
||||||
|
@@ -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
3
assets/syntaxes/02_Extra/INI.sublime-syntax
vendored
3
assets/syntaxes/02_Extra/INI.sublime-syntax
vendored
@@ -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/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
|
|
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/cmd-help
vendored
2
assets/syntaxes/02_Extra/cmd-help
vendored
Submodule assets/syntaxes/02_Extra/cmd-help updated: f41e5fc838...1e513f5f19
76
assets/syntaxes/02_Extra/log.sublime-syntax
vendored
76
assets/syntaxes/02_Extra/log.sublime-syntax
vendored
@@ -7,15 +7,8 @@ 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)
|
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
|
||||||
@@ -32,58 +25,16 @@ contexts:
|
|||||||
- 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
|
||||||
|
- match: \b(?i:debug)\b
|
||||||
|
scope: markup.info.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|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
|
||||||
@@ -98,12 +49,14 @@ contexts:
|
|||||||
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
|
- match: ''
|
||||||
|
pop: true
|
||||||
maybe_date_time_separator:
|
maybe_date_time_separator:
|
||||||
- match: T(?={{hours_minutes_seconds}})
|
- match: T(?={{hours_minutes_seconds}})
|
||||||
scope: meta.date.log meta.time.log keyword.other.log
|
scope: meta.date.log meta.time.log keyword.other.log
|
||||||
set: time
|
set: time
|
||||||
- include: immediately_pop
|
- match: ''
|
||||||
|
pop: true
|
||||||
ip_addresses:
|
ip_addresses:
|
||||||
- match: \b(?=(?:{{ipv4_part}}\.){3}{{ipv4_part}}\b)
|
- match: \b(?=(?:{{ipv4_part}}\.){3}{{ipv4_part}}\b)
|
||||||
push:
|
push:
|
||||||
@@ -112,7 +65,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 +74,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,7 +127,8 @@ 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: ''
|
||||||
|
pop: true
|
||||||
double_quoted_string:
|
double_quoted_string:
|
||||||
- meta_scope: string.quoted.double.log
|
- meta_scope: string.quoted.double.log
|
||||||
- match: \\"
|
- match: \\"
|
||||||
|
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
@@ -186,7 +186,7 @@ man 2 select
|
|||||||
### 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
|
||||||
|
@@ -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
|
|
@@ -5,7 +5,7 @@
|
|||||||
- [ ] 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 -e 'rust.*1\.' -e '1\..*rust' | grep README | grep -v tests/`.
|
`git grep -i -e 'rust.*1\.' -e '1\..*rust' | grep README | grep -v tests/`.
|
||||||
@@ -20,7 +20,7 @@
|
|||||||
|
|
||||||
## Documentation
|
## Documentation
|
||||||
|
|
||||||
- [ ] Review [`-h`](./short-help.txt), [`--help`](./long-help.txt), and the `man` page. The `man` page is shown in
|
- [ ] Review `-h`, `--help`, and the `man` page. All of these are shown in
|
||||||
the output of the CI job called *Documentation*, so look there.
|
the output of the CI job called *Documentation*, so look there.
|
||||||
The CI workflow corresponding to the tip of the master branch is a good place to look.
|
The CI workflow corresponding to the tip of the master branch is a good place to look.
|
||||||
|
|
||||||
|
@@ -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,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() {
|
||||||
|
21
plugins/curl.lua
Normal file
21
plugins/curl.lua
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
function tempdir()
|
||||||
|
local stream = assert(io.popen('mktemp --directory'))
|
||||||
|
local output = stream:read('*all')
|
||||||
|
stream:close()
|
||||||
|
return string.gsub(output, "\n", "")
|
||||||
|
end
|
||||||
|
|
||||||
|
function preprocess(path_or_url)
|
||||||
|
filename_from_url = string.match(path_or_url, '^https?://.*/(.*)$')
|
||||||
|
if filename_from_url then
|
||||||
|
local temp_directory = tempdir()
|
||||||
|
local new_path = temp_directory .. "/" .. filename_from_url
|
||||||
|
|
||||||
|
-- TODO: how to prevent shell injection bugs?
|
||||||
|
os.execute("curl --silent '" .. path_or_url .. "' --output '" .. new_path .. "'")
|
||||||
|
|
||||||
|
return new_path
|
||||||
|
else
|
||||||
|
return path_or_url
|
||||||
|
end
|
||||||
|
end
|
17
plugins/directories.lua
Normal file
17
plugins/directories.lua
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
-- https://stackoverflow.com/a/3254007/704831
|
||||||
|
function is_dir(path)
|
||||||
|
local f = io.open(path, "r")
|
||||||
|
local ok, err, code = f:read(1)
|
||||||
|
f:close()
|
||||||
|
return code == 21
|
||||||
|
end
|
||||||
|
|
||||||
|
function preprocess(path)
|
||||||
|
if is_dir(path) then
|
||||||
|
tmpfile = os.tmpname()
|
||||||
|
os.execute("ls -alh --color=always '" .. path .. "' > '" .. tmpfile .. "'")
|
||||||
|
return tmpfile
|
||||||
|
else
|
||||||
|
return path
|
||||||
|
end
|
||||||
|
end
|
21
plugins/hexyl.lua
Normal file
21
plugins/hexyl.lua
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
-- Note: this plugin depends on the existence of 'inspect' [1] and 'hexyl' [2]
|
||||||
|
--
|
||||||
|
-- [1] https://github.com/sharkdp/content_inspector
|
||||||
|
-- [2] https://github.com/sharkdp/hexyl
|
||||||
|
|
||||||
|
function is_binary(path)
|
||||||
|
local stream = assert(io.popen("inspect '" .. path .. "'"))
|
||||||
|
local output = stream:read('*all')
|
||||||
|
stream:close()
|
||||||
|
return string.find(output, ": binary\n")
|
||||||
|
end
|
||||||
|
|
||||||
|
function preprocess(path)
|
||||||
|
if is_binary(path) then
|
||||||
|
tmpfile = os.tmpname()
|
||||||
|
os.execute("hexyl --length 1024 --no-position --border=none --no-squeezing '" .. path .. "' > '" .. tmpfile .. "'")
|
||||||
|
return tmpfile
|
||||||
|
else
|
||||||
|
return path
|
||||||
|
end
|
||||||
|
end
|
21
plugins/uncompress.lua
Normal file
21
plugins/uncompress.lua
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
function tempdir()
|
||||||
|
local stream = assert(io.popen('mktemp --directory'))
|
||||||
|
local output = stream:read('*all')
|
||||||
|
stream:close()
|
||||||
|
return string.gsub(output, "\n", "")
|
||||||
|
end
|
||||||
|
|
||||||
|
function preprocess(path)
|
||||||
|
prefix = string.match(path, '^(.*)%.gz$')
|
||||||
|
if prefix then
|
||||||
|
local temp_directory = tempdir()
|
||||||
|
local new_path = temp_directory .. "/" .. prefix
|
||||||
|
|
||||||
|
-- TODO: how to prevent shell injection bugs?
|
||||||
|
os.execute("gunzip < '" .. path .. "' > '" .. new_path .. "'")
|
||||||
|
|
||||||
|
return new_path
|
||||||
|
else
|
||||||
|
return path
|
||||||
|
end
|
||||||
|
end
|
@@ -84,7 +84,7 @@ impl HighlightingAssets {
|
|||||||
/// platform, the default theme depends on
|
/// platform, the default theme depends on
|
||||||
/// ```bash
|
/// ```bash
|
||||||
/// defaults read -globalDomain AppleInterfaceStyle
|
/// defaults read -globalDomain AppleInterfaceStyle
|
||||||
/// ```
|
/// ````
|
||||||
/// To avoid the overhead of the check on macOS, simply specify a theme
|
/// To avoid the overhead of the check on macOS, simply specify a theme
|
||||||
/// explicitly via `--theme`, `BAT_THEME`, or `~/.config/bat`.
|
/// explicitly via `--theme`, `BAT_THEME`, or `~/.config/bat`.
|
||||||
///
|
///
|
||||||
@@ -401,21 +401,11 @@ fn asset_from_cache<T: serde::de::DeserializeOwned>(
|
|||||||
|
|
||||||
#[cfg(target_os = "macos")]
|
#[cfg(target_os = "macos")]
|
||||||
fn macos_dark_mode_active() -> bool {
|
fn macos_dark_mode_active() -> bool {
|
||||||
const PREFERENCES_FILE: &str = "Library/Preferences/.GlobalPreferences.plist";
|
let mut defaults_cmd = std::process::Command::new("defaults");
|
||||||
const STYLE_KEY: &str = "AppleInterfaceStyle";
|
defaults_cmd.args(&["read", "-globalDomain", "AppleInterfaceStyle"]);
|
||||||
|
match defaults_cmd.output() {
|
||||||
let preferences_file = dirs::home_dir()
|
Ok(output) => output.stdout == b"Dark\n",
|
||||||
.map(|home| home.join(PREFERENCES_FILE))
|
Err(_) => true,
|
||||||
.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,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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,50 @@ 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"),
|
||||||
|
plugins: self
|
||||||
|
.matches
|
||||||
|
.values_of_os("load-plugin")
|
||||||
|
.unwrap_or_default()
|
||||||
|
.collect(),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
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 +299,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,6 +326,7 @@ impl App {
|
|||||||
.filter_map(|style| style.ok())
|
.filter_map(|style| style.ok())
|
||||||
.collect::<Vec<_>>()
|
.collect::<Vec<_>>()
|
||||||
})
|
})
|
||||||
|
.or(env_style_components)
|
||||||
.unwrap_or_else(|| vec![StyleComponent::Default])
|
.unwrap_or_else(|| vec![StyleComponent::Default])
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|style| style.components(self.interactive_output))
|
.map(|style| style.components(self.interactive_output))
|
||||||
@@ -357,8 +334,7 @@ impl App {
|
|||||||
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,21 +376,24 @@ 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",
|
||||||
@@ -415,7 +415,7 @@ 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(
|
||||||
@@ -447,11 +447,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 +467,28 @@ 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("load-plugin")
|
||||||
.short('u')
|
.long("load-plugin")
|
||||||
|
.multiple(true)
|
||||||
|
.takes_value(true)
|
||||||
|
.number_of_values(1)
|
||||||
|
.value_name("name")
|
||||||
|
.help("Load plugin with specified name.")
|
||||||
|
.hidden_short_help(true)
|
||||||
|
)
|
||||||
|
.arg(
|
||||||
|
Arg::with_name("unbuffered")
|
||||||
|
.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 +496,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 +557,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 +570,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 +608,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_default())
|
||||||
}
|
|
||||||
|
|
||||||
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,21 @@ mod directories;
|
|||||||
mod input;
|
mod input;
|
||||||
|
|
||||||
use std::collections::{HashMap, HashSet};
|
use std::collections::{HashMap, HashSet};
|
||||||
use std::fmt::Write as _;
|
use std::ffi::OsStr;
|
||||||
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 +38,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 +83,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 +126,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 +147,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 +158,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 +178,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 +208,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,21 +219,78 @@ 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 load_and_run_preprocess_plugins(plugins: &[&OsStr], inputs: &mut Vec<Input>) -> Result<()> {
|
||||||
let assets = assets_from_cache_or_binary(config.use_custom_assets, cache_dir)?;
|
use bat::input::InputKind;
|
||||||
|
use rlua::{Function, Lua, Result as LuaResult};
|
||||||
|
use std::fs;
|
||||||
|
use std::path::PathBuf;
|
||||||
|
|
||||||
|
if plugins.is_empty() {
|
||||||
|
// Do not create Lua context if there are no plugins
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
|
||||||
|
let lua = Lua::new();
|
||||||
|
|
||||||
|
for plugin_name in plugins {
|
||||||
|
// TODO: properly load plugins from a central directory + user directories
|
||||||
|
// TODO: how to handle plugin priority?
|
||||||
|
let mut plugin_path = PathBuf::from("plugins");
|
||||||
|
plugin_path.push(plugin_name);
|
||||||
|
|
||||||
|
let plugin_source_code = fs::read_to_string(&plugin_path).map_err(|e| {
|
||||||
|
format!(
|
||||||
|
"Could not load bat plugin '{}': {}",
|
||||||
|
plugin_path.to_string_lossy(),
|
||||||
|
e
|
||||||
|
)
|
||||||
|
})?;
|
||||||
|
|
||||||
|
lua.context::<_, LuaResult<()>>(|lua_ctx| {
|
||||||
|
let globals = lua_ctx.globals();
|
||||||
|
|
||||||
|
lua_ctx.load(&plugin_source_code).exec()?;
|
||||||
|
|
||||||
|
// Plugins are expected to have a 'preprocess' function
|
||||||
|
let preprocess: Function = globals.get("preprocess")?;
|
||||||
|
|
||||||
|
for input in inputs.iter_mut() {
|
||||||
|
if let InputKind::OrdinaryFile(ref mut path) = &mut input.kind {
|
||||||
|
let path_str: String = path.to_string_lossy().into();
|
||||||
|
let new_path = preprocess.call::<_, String>(path_str)?;
|
||||||
|
|
||||||
|
*path = PathBuf::from(new_path);
|
||||||
|
|
||||||
|
// TODO: the following line overwrites actual user provided names. However,
|
||||||
|
// this is necessary to get proper syntax highlighting for the path that
|
||||||
|
// is being provided by the plugin.
|
||||||
|
input.metadata.user_provided_name = Some(path.clone());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
})
|
||||||
|
.map_err(|e| format!("Error while executing Lua code: {}", e))?;
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn run_controller(mut inputs: Vec<Input>, config: &Config) -> Result<bool> {
|
||||||
|
load_and_run_preprocess_plugins(&config.plugins, &mut inputs)?;
|
||||||
|
|
||||||
|
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();
|
let mut custom_assets_metadata = PROJECT_DIRS.cache_dir().to_path_buf();
|
||||||
custom_assets_metadata.push("metadata.yaml");
|
custom_assets_metadata.push("metadata.yaml");
|
||||||
|
|
||||||
let mut report = bugreport!()
|
let mut report = bugreport!()
|
||||||
@@ -267,13 +316,15 @@ 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(
|
.info(FileContent::new(
|
||||||
"Custom assets metadata",
|
"Custom assets metadata",
|
||||||
custom_assets_metadata,
|
custom_assets_metadata,
|
||||||
))
|
))
|
||||||
.info(DirectoryEntries::new("Custom assets", cache_dir))
|
.info(DirectoryEntries::new(
|
||||||
|
"Custom assets",
|
||||||
|
PROJECT_DIRS.cache_dir(),
|
||||||
|
))
|
||||||
.info(CompileTimeInformation::default());
|
.info(CompileTimeInformation::default());
|
||||||
|
|
||||||
#[cfg(feature = "paging")]
|
#[cfg(feature = "paging")]
|
||||||
@@ -292,70 +343,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,11 +1,12 @@
|
|||||||
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;
|
||||||
use crate::syntax_mapping::SyntaxMapping;
|
use crate::syntax_mapping::SyntaxMapping;
|
||||||
use crate::wrapping::WrappingMode;
|
use crate::wrapping::WrappingMode;
|
||||||
|
|
||||||
|
use std::ffi::OsStr;
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub enum VisibleLines {
|
pub enum VisibleLines {
|
||||||
/// Show all lines which are included in the line ranges
|
/// Show all lines which are included in the line ranges
|
||||||
@@ -40,9 +41,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,
|
||||||
|
|
||||||
@@ -90,6 +88,9 @@ pub struct Config<'a> {
|
|||||||
/// Whether or not to allow custom assets. If this is false or if custom assets (a.k.a.
|
/// Whether or not to allow custom assets. If this is false or if custom assets (a.k.a.
|
||||||
/// cached assets) are not available, assets from the binary will be used instead.
|
/// cached assets) are not available, assets from the binary will be used instead.
|
||||||
pub use_custom_assets: bool,
|
pub use_custom_assets: bool,
|
||||||
|
|
||||||
|
/// List of bat plugins to be loaded
|
||||||
|
pub plugins: Vec<&'a OsStr>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(all(feature = "minimal-application", feature = "paging"))]
|
#[cfg(all(feature = "minimal-application", feature = "paging"))]
|
||||||
|
@@ -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();
|
||||||
|
@@ -43,7 +43,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 => {
|
||||||
|
12
src/input.rs
12
src/input.rs
@@ -69,7 +69,8 @@ impl InputDescription {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) enum InputKind<'a> {
|
pub enum InputKind<'a> {
|
||||||
|
// TODO
|
||||||
OrdinaryFile(PathBuf),
|
OrdinaryFile(PathBuf),
|
||||||
StdIn,
|
StdIn,
|
||||||
CustomReader(Box<dyn Read + 'a>),
|
CustomReader(Box<dyn Read + 'a>),
|
||||||
@@ -86,14 +87,15 @@ impl<'a> InputKind<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Default)]
|
#[derive(Clone, Default)]
|
||||||
pub(crate) struct InputMetadata {
|
pub struct InputMetadata {
|
||||||
pub(crate) user_provided_name: Option<PathBuf>,
|
// TODO
|
||||||
|
pub user_provided_name: Option<PathBuf>,
|
||||||
pub(crate) size: Option<u64>,
|
pub(crate) size: Option<u64>,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct Input<'a> {
|
pub struct Input<'a> {
|
||||||
pub(crate) kind: InputKind<'a>,
|
pub kind: InputKind<'a>, // TODO
|
||||||
pub(crate) metadata: InputMetadata,
|
pub metadata: InputMetadata, // TODO
|
||||||
pub(crate) description: InputDescription,
|
pub(crate) description: InputDescription,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -3,7 +3,7 @@
|
|||||||
use std::ffi::OsStr;
|
use std::ffi::OsStr;
|
||||||
use std::process::Command;
|
use std::process::Command;
|
||||||
|
|
||||||
#[derive(Debug, PartialEq, Eq)]
|
#[derive(Debug, PartialEq)]
|
||||||
pub enum LessVersion {
|
pub enum LessVersion {
|
||||||
Less(usize),
|
Less(usize),
|
||||||
BusyBox,
|
BusyBox,
|
||||||
|
@@ -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,
|
|
||||||
}
|
|
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,11 +47,7 @@ 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 };
|
||||||
@@ -85,37 +77,19 @@ pub fn replace_nonprintable(
|
|||||||
}
|
}
|
||||||
// line feed
|
// line feed
|
||||||
'\x0A' => {
|
'\x0A' => {
|
||||||
output.push_str(match nonprintable_notation {
|
output.push_str("␊\x0A");
|
||||||
NonprintableNotation::Caret => "^J\x0A",
|
|
||||||
NonprintableNotation::Unicode => "␊\x0A",
|
|
||||||
});
|
|
||||||
line_idx = 0;
|
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 +101,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
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -246,57 +240,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
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -629,7 +612,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 +638,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,
|
||||||
|
@@ -129,12 +129,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.
|
||||||
@@ -66,14 +66,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
|
||||||
@@ -194,7 +186,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 +197,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>
|
|
1
tests/examples/long-single-line.txt
vendored
1
tests/examples/long-single-line.txt
vendored
@@ -1 +0,0 @@
|
|||||||
abcdefghigklmnopqrstuvxyzabcdefghigklmnopqrstuvxyzabcdefghigklmnopqrstuvxyzabcdefghigklmnopqrstuvxyz
|
|
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"}
|
|
1
tests/examples/test_BOM.txt
vendored
1
tests/examples/test_BOM.txt
vendored
@@ -1 +0,0 @@
|
|||||||
hello world
|
|
@@ -1,7 +1,9 @@
|
|||||||
|
use assert_cmd::cargo::CommandCargoExt;
|
||||||
use predicates::boolean::PredicateBooleanExt;
|
use predicates::boolean::PredicateBooleanExt;
|
||||||
use predicates::{prelude::predicate, str::PredicateStrExt};
|
use predicates::{prelude::predicate, str::PredicateStrExt};
|
||||||
use serial_test::serial;
|
use serial_test::serial;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
|
use std::process::Command;
|
||||||
use std::str::from_utf8;
|
use std::str::from_utf8;
|
||||||
use tempfile::tempdir;
|
use tempfile::tempdir;
|
||||||
|
|
||||||
@@ -26,14 +28,41 @@ mod unix {
|
|||||||
use unix::*;
|
use unix::*;
|
||||||
|
|
||||||
mod utils;
|
mod utils;
|
||||||
use utils::command::{bat, bat_with_config};
|
|
||||||
|
|
||||||
#[cfg(unix)]
|
|
||||||
use utils::command::bat_raw_command;
|
|
||||||
use utils::mocked_pagers;
|
use utils::mocked_pagers;
|
||||||
|
|
||||||
const EXAMPLES_DIR: &str = "tests/examples";
|
const EXAMPLES_DIR: &str = "tests/examples";
|
||||||
|
|
||||||
|
fn bat_raw_command_with_config() -> Command {
|
||||||
|
let mut cmd = Command::cargo_bin("bat").unwrap();
|
||||||
|
cmd.current_dir("tests/examples");
|
||||||
|
cmd.env_remove("BAT_CACHE_PATH");
|
||||||
|
cmd.env_remove("BAT_CONFIG_DIR");
|
||||||
|
cmd.env_remove("BAT_CONFIG_PATH");
|
||||||
|
cmd.env_remove("BAT_OPTS");
|
||||||
|
cmd.env_remove("BAT_PAGER");
|
||||||
|
cmd.env_remove("BAT_STYLE");
|
||||||
|
cmd.env_remove("BAT_TABS");
|
||||||
|
cmd.env_remove("BAT_THEME");
|
||||||
|
cmd.env_remove("COLORTERM");
|
||||||
|
cmd.env_remove("NO_COLOR");
|
||||||
|
cmd.env_remove("PAGER");
|
||||||
|
cmd
|
||||||
|
}
|
||||||
|
|
||||||
|
fn bat_raw_command() -> Command {
|
||||||
|
let mut cmd = bat_raw_command_with_config();
|
||||||
|
cmd.arg("--no-config");
|
||||||
|
cmd
|
||||||
|
}
|
||||||
|
|
||||||
|
fn bat_with_config() -> assert_cmd::Command {
|
||||||
|
assert_cmd::Command::from_std(bat_raw_command_with_config())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn bat() -> assert_cmd::Command {
|
||||||
|
assert_cmd::Command::from_std(bat_raw_command())
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn basic() {
|
fn basic() {
|
||||||
bat()
|
bat()
|
||||||
@@ -200,24 +229,6 @@ fn line_range_multiple() {
|
|||||||
.stdout("line 1\nline 2\nline 4\n");
|
.stdout("line 1\nline 2\nline 4\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
|
||||||
#[cfg_attr(any(not(feature = "git"), target_os = "windows"), ignore)]
|
|
||||||
fn short_help() {
|
|
||||||
test_help("-h", "../doc/short-help.txt");
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
#[cfg_attr(any(not(feature = "git"), target_os = "windows"), ignore)]
|
|
||||||
fn long_help() {
|
|
||||||
test_help("--help", "../doc/long-help.txt");
|
|
||||||
}
|
|
||||||
|
|
||||||
fn test_help(arg: &str, expect_file: &str) {
|
|
||||||
let assert = bat().arg(arg).assert();
|
|
||||||
expect_test::expect_file![expect_file]
|
|
||||||
.assert_eq(&String::from_utf8_lossy(&assert.get_output().stdout));
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(unix)]
|
#[cfg(unix)]
|
||||||
fn setup_temp_file(content: &[u8]) -> io::Result<(PathBuf, tempfile::TempDir)> {
|
fn setup_temp_file(content: &[u8]) -> io::Result<(PathBuf, tempfile::TempDir)> {
|
||||||
let dir = tempfile::tempdir().expect("Couldn't create tempdir");
|
let dir = tempfile::tempdir().expect("Couldn't create tempdir");
|
||||||
@@ -495,79 +506,6 @@ fn tabs_8() {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn tabs_4_env_overrides_config() {
|
|
||||||
bat_with_config()
|
|
||||||
.env("BAT_CONFIG_PATH", "bat-tabs.conf")
|
|
||||||
.env("BAT_TABS", "4")
|
|
||||||
.arg("tabs.txt")
|
|
||||||
.arg("--style=plain")
|
|
||||||
.arg("--decorations=always")
|
|
||||||
.assert()
|
|
||||||
.success()
|
|
||||||
.stdout(
|
|
||||||
" 1 2 3 4
|
|
||||||
1 ?
|
|
||||||
22 ?
|
|
||||||
333 ?
|
|
||||||
4444 ?
|
|
||||||
55555 ?
|
|
||||||
666666 ?
|
|
||||||
7777777 ?
|
|
||||||
88888888 ?
|
|
||||||
",
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn tabs_4_arg_overrides_env() {
|
|
||||||
bat_with_config()
|
|
||||||
.env("BAT_CONFIG_PATH", "bat-tabs.conf")
|
|
||||||
.env("BAT_TABS", "6")
|
|
||||||
.arg("tabs.txt")
|
|
||||||
.arg("--tabs=4")
|
|
||||||
.arg("--style=plain")
|
|
||||||
.arg("--decorations=always")
|
|
||||||
.assert()
|
|
||||||
.success()
|
|
||||||
.stdout(
|
|
||||||
" 1 2 3 4
|
|
||||||
1 ?
|
|
||||||
22 ?
|
|
||||||
333 ?
|
|
||||||
4444 ?
|
|
||||||
55555 ?
|
|
||||||
666666 ?
|
|
||||||
7777777 ?
|
|
||||||
88888888 ?
|
|
||||||
",
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn tabs_4_arg_overrides_env_noconfig() {
|
|
||||||
bat()
|
|
||||||
.env("BAT_TABS", "6")
|
|
||||||
.arg("tabs.txt")
|
|
||||||
.arg("--tabs=4")
|
|
||||||
.arg("--style=plain")
|
|
||||||
.arg("--decorations=always")
|
|
||||||
.assert()
|
|
||||||
.success()
|
|
||||||
.stdout(
|
|
||||||
" 1 2 3 4
|
|
||||||
1 ?
|
|
||||||
22 ?
|
|
||||||
333 ?
|
|
||||||
4444 ?
|
|
||||||
55555 ?
|
|
||||||
666666 ?
|
|
||||||
7777777 ?
|
|
||||||
88888888 ?
|
|
||||||
",
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn fail_non_existing() {
|
fn fail_non_existing() {
|
||||||
bat().arg("non-existing-file").assert().failure();
|
bat().arg("non-existing-file").assert().failure();
|
||||||
@@ -599,17 +537,6 @@ fn pager_basic() {
|
|||||||
.stdout(predicate::eq("pager-output\n").normalize());
|
.stdout(predicate::eq("pager-output\n").normalize());
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn pager_basic_arg() {
|
|
||||||
bat()
|
|
||||||
.arg("--pager=echo pager-output")
|
|
||||||
.arg("--paging=always")
|
|
||||||
.arg("test.txt")
|
|
||||||
.assert()
|
|
||||||
.success()
|
|
||||||
.stdout(predicate::eq("pager-output\n").normalize());
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn pager_overwrite() {
|
fn pager_overwrite() {
|
||||||
bat()
|
bat()
|
||||||
@@ -634,58 +561,6 @@ fn pager_disable() {
|
|||||||
.stdout(predicate::eq("hello world\n").normalize());
|
.stdout(predicate::eq("hello world\n").normalize());
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn pager_arg_override_env_withconfig() {
|
|
||||||
bat_with_config()
|
|
||||||
.env("BAT_CONFIG_PATH", "bat.conf")
|
|
||||||
.env("PAGER", "echo another-pager")
|
|
||||||
.env("BAT_PAGER", "echo other-pager")
|
|
||||||
.arg("--pager=echo pager-output")
|
|
||||||
.arg("--paging=always")
|
|
||||||
.arg("test.txt")
|
|
||||||
.assert()
|
|
||||||
.success()
|
|
||||||
.stdout(predicate::eq("pager-output\n").normalize());
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn pager_arg_override_env_noconfig() {
|
|
||||||
bat()
|
|
||||||
.env("PAGER", "echo another-pager")
|
|
||||||
.env("BAT_PAGER", "echo other-pager")
|
|
||||||
.arg("--pager=echo pager-output")
|
|
||||||
.arg("--paging=always")
|
|
||||||
.arg("test.txt")
|
|
||||||
.assert()
|
|
||||||
.success()
|
|
||||||
.stdout(predicate::eq("pager-output\n").normalize());
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn pager_env_bat_pager_override_config() {
|
|
||||||
bat_with_config()
|
|
||||||
.env("BAT_CONFIG_PATH", "bat.conf")
|
|
||||||
.env("PAGER", "echo other-pager")
|
|
||||||
.env("BAT_PAGER", "echo pager-output")
|
|
||||||
.arg("--paging=always")
|
|
||||||
.arg("test.txt")
|
|
||||||
.assert()
|
|
||||||
.success()
|
|
||||||
.stdout(predicate::eq("pager-output\n").normalize());
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn pager_env_pager_nooverride_config() {
|
|
||||||
bat_with_config()
|
|
||||||
.env("BAT_CONFIG_PATH", "bat.conf")
|
|
||||||
.env("PAGER", "echo other-pager")
|
|
||||||
.arg("--paging=always")
|
|
||||||
.arg("test.txt")
|
|
||||||
.assert()
|
|
||||||
.success()
|
|
||||||
.stdout(predicate::eq("dummy-pager-from-config\n").normalize());
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn env_var_pager_value_bat() {
|
fn env_var_pager_value_bat() {
|
||||||
bat()
|
bat()
|
||||||
@@ -820,18 +695,6 @@ fn alias_pager_disable_long_overrides_short() {
|
|||||||
.stdout(predicate::eq("pager-output\n").normalize());
|
.stdout(predicate::eq("pager-output\n").normalize());
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn disable_pager_if_disable_paging_flag_comes_after_paging() {
|
|
||||||
bat()
|
|
||||||
.env("PAGER", "echo pager-output")
|
|
||||||
.arg("--paging=always")
|
|
||||||
.arg("-P")
|
|
||||||
.arg("test.txt")
|
|
||||||
.assert()
|
|
||||||
.success()
|
|
||||||
.stdout(predicate::eq("hello world\n").normalize());
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn pager_failed_to_parse() {
|
fn pager_failed_to_parse() {
|
||||||
bat()
|
bat()
|
||||||
@@ -910,161 +773,16 @@ fn config_read_arguments_from_file() {
|
|||||||
.stdout(predicate::eq("dummy-pager-from-config\n").normalize());
|
.stdout(predicate::eq("dummy-pager-from-config\n").normalize());
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(unix)]
|
|
||||||
#[test]
|
|
||||||
fn cache_clear() {
|
|
||||||
let src_dir = "cache_source";
|
|
||||||
let tmp_dir = tempdir().expect("can create temporary directory");
|
|
||||||
let themes_filename = "themes.bin";
|
|
||||||
let syntaxes_filename = "syntaxes.bin";
|
|
||||||
let metadata_filename = "metadata.yaml";
|
|
||||||
[themes_filename, syntaxes_filename, metadata_filename]
|
|
||||||
.iter()
|
|
||||||
.map(|filename| {
|
|
||||||
let fp = tmp_dir.path().join(filename);
|
|
||||||
let mut file = File::create(fp).expect("can create temporary file");
|
|
||||||
writeln!(file, "dummy content").expect("can write to file");
|
|
||||||
})
|
|
||||||
.count();
|
|
||||||
|
|
||||||
// Clear the targeted cache
|
|
||||||
// Include the BAT_CONFIG_PATH and BAT_THEME environment variables to ensure that
|
|
||||||
// options loaded from a config or the environment are not inserted
|
|
||||||
// before the cache subcommand, which would break it.
|
|
||||||
bat_with_config()
|
|
||||||
.current_dir(Path::new(EXAMPLES_DIR).join(src_dir))
|
|
||||||
.env("BAT_CONFIG_PATH", "bat.conf")
|
|
||||||
.env("BAT_THEME", "1337")
|
|
||||||
.arg("cache")
|
|
||||||
.arg("--clear")
|
|
||||||
.arg("--source")
|
|
||||||
.arg(".")
|
|
||||||
.arg("--target")
|
|
||||||
.arg(tmp_dir.path().to_str().unwrap())
|
|
||||||
.assert()
|
|
||||||
.success()
|
|
||||||
.stdout(
|
|
||||||
predicate::str::is_match(
|
|
||||||
"Clearing theme set cache ... okay
|
|
||||||
Clearing syntax set cache ... okay
|
|
||||||
Clearing metadata file ... okay",
|
|
||||||
)
|
|
||||||
.unwrap(),
|
|
||||||
);
|
|
||||||
|
|
||||||
// We expect these files to be removed
|
|
||||||
assert!(!tmp_dir.path().join(themes_filename).exists());
|
|
||||||
assert!(!tmp_dir.path().join(syntaxes_filename).exists());
|
|
||||||
assert!(!tmp_dir.path().join(metadata_filename).exists());
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(unix)]
|
|
||||||
#[test]
|
|
||||||
fn cache_build() {
|
|
||||||
let src_dir = "cache_source";
|
|
||||||
let tmp_dir = tempdir().expect("can create temporary directory");
|
|
||||||
let tmp_themes_path = tmp_dir.path().join("themes.bin");
|
|
||||||
let tmp_syntaxes_path = tmp_dir.path().join("syntaxes.bin");
|
|
||||||
let tmp_acknowledgements_path = tmp_dir.path().join("acknowledgements.bin");
|
|
||||||
let tmp_metadata_path = tmp_dir.path().join("metadata.yaml");
|
|
||||||
|
|
||||||
// Build the cache
|
|
||||||
// Include the BAT_CONFIG_PATH and BAT_THEME environment variables to ensure that
|
|
||||||
// options loaded from a config or the environment are not inserted
|
|
||||||
// before the cache subcommand, which would break it.
|
|
||||||
bat_with_config()
|
|
||||||
.current_dir(Path::new(EXAMPLES_DIR).join(src_dir))
|
|
||||||
.env("BAT_CONFIG_PATH", "bat.conf")
|
|
||||||
.env("BAT_THEME", "1337")
|
|
||||||
.arg("cache")
|
|
||||||
.arg("--build")
|
|
||||||
.arg("--blank")
|
|
||||||
.arg("--source")
|
|
||||||
.arg(".")
|
|
||||||
.arg("--target")
|
|
||||||
.arg(tmp_dir.path().to_str().unwrap())
|
|
||||||
.arg("--acknowledgements")
|
|
||||||
.assert()
|
|
||||||
.success()
|
|
||||||
.stdout(
|
|
||||||
predicate::str::is_match(
|
|
||||||
"Writing theme set to .*/themes.bin ... okay
|
|
||||||
Writing syntax set to .*/syntaxes.bin ... okay
|
|
||||||
Writing acknowledgements to .*/acknowledgements.bin ... okay
|
|
||||||
Writing metadata to folder .* ... okay",
|
|
||||||
)
|
|
||||||
.unwrap(),
|
|
||||||
);
|
|
||||||
|
|
||||||
// Now we expect the files to exist. If they exist, we assume contents are correct
|
|
||||||
assert!(tmp_themes_path.exists());
|
|
||||||
assert!(tmp_syntaxes_path.exists());
|
|
||||||
assert!(tmp_acknowledgements_path.exists());
|
|
||||||
assert!(tmp_metadata_path.exists());
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn utf16() {
|
fn utf16() {
|
||||||
// The output will be converted to UTF-8 with the leading UTF-16
|
// The output will be converted to UTF-8 with a leading UTF-8 BOM
|
||||||
// BOM removed. This behavior is wanted in interactive mode as
|
|
||||||
// some terminals seem to display the BOM character as a space,
|
|
||||||
// and it also breaks syntax highlighting.
|
|
||||||
bat()
|
bat()
|
||||||
.arg("--plain")
|
.arg("--plain")
|
||||||
.arg("--decorations=always")
|
.arg("--decorations=always")
|
||||||
.arg("test_UTF-16LE.txt")
|
.arg("test_UTF-16LE.txt")
|
||||||
.assert()
|
.assert()
|
||||||
.success()
|
.success()
|
||||||
.stdout("hello world\n");
|
.stdout(std::str::from_utf8(b"\xEF\xBB\xBFhello world\n").unwrap());
|
||||||
}
|
|
||||||
|
|
||||||
// Regression test for https://github.com/sharkdp/bat/issues/1922
|
|
||||||
#[test]
|
|
||||||
fn bom_not_stripped_in_loop_through_mode() {
|
|
||||||
bat()
|
|
||||||
.arg("--plain")
|
|
||||||
.arg("--decorations=never")
|
|
||||||
.arg("--color=never")
|
|
||||||
.arg("test_BOM.txt")
|
|
||||||
.assert()
|
|
||||||
.success()
|
|
||||||
.stdout("\u{feff}hello world\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Regression test for https://github.com/sharkdp/bat/issues/1922
|
|
||||||
#[test]
|
|
||||||
fn bom_stripped_when_colored_output() {
|
|
||||||
bat()
|
|
||||||
.arg("--color=always")
|
|
||||||
.arg("--decorations=never")
|
|
||||||
.arg("test_BOM.txt")
|
|
||||||
.assert()
|
|
||||||
.success()
|
|
||||||
.stdout(
|
|
||||||
predicate::str::is_match("\u{1b}\\[38;5;[0-9]{3}mhello world\u{1b}\\[0m\n").unwrap(),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Regression test for https://github.com/sharkdp/bat/issues/1922
|
|
||||||
#[test]
|
|
||||||
fn bom_stripped_when_no_color_and_not_loop_through() {
|
|
||||||
bat()
|
|
||||||
.arg("--color=never")
|
|
||||||
.arg("--decorations=always")
|
|
||||||
.arg("--style=numbers,grid,header")
|
|
||||||
.arg("--terminal-width=80")
|
|
||||||
.arg("test_BOM.txt")
|
|
||||||
.assert()
|
|
||||||
.success()
|
|
||||||
.stdout(
|
|
||||||
"\
|
|
||||||
─────┬──────────────────────────────────────────────────────────────────────────
|
|
||||||
│ File: test_BOM.txt
|
|
||||||
─────┼──────────────────────────────────────────────────────────────────────────
|
|
||||||
1 │ hello world
|
|
||||||
─────┴──────────────────────────────────────────────────────────────────────────
|
|
||||||
",
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@@ -1228,35 +946,6 @@ fn header_full_basic() {
|
|||||||
.stderr("");
|
.stderr("");
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn header_env_basic() {
|
|
||||||
bat_with_config()
|
|
||||||
.env("BAT_STYLE", "header-filename,header-filesize")
|
|
||||||
.arg("test.txt")
|
|
||||||
.arg("--decorations=always")
|
|
||||||
.arg("-r=0:0")
|
|
||||||
.arg("--file-name=foo")
|
|
||||||
.assert()
|
|
||||||
.success()
|
|
||||||
.stdout("File: foo\nSize: 12 B\n")
|
|
||||||
.stderr("");
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn header_arg_overrides_env() {
|
|
||||||
bat_with_config()
|
|
||||||
.env("BAT_STYLE", "header-filesize")
|
|
||||||
.arg("test.txt")
|
|
||||||
.arg("--decorations=always")
|
|
||||||
.arg("--style=header-filename")
|
|
||||||
.arg("-r=0:0")
|
|
||||||
.arg("--file-name=foo")
|
|
||||||
.assert()
|
|
||||||
.success()
|
|
||||||
.stdout("File: foo\n")
|
|
||||||
.stderr("");
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn header_binary() {
|
fn header_binary() {
|
||||||
bat()
|
bat()
|
||||||
@@ -1286,7 +975,6 @@ fn header_full_binary() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
#[cfg(feature = "git")] // Expected output assumes git is enabled
|
|
||||||
fn header_default() {
|
fn header_default() {
|
||||||
bat()
|
bat()
|
||||||
.arg("--paging=never")
|
.arg("--paging=never")
|
||||||
@@ -1311,7 +999,6 @@ fn header_default() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
#[cfg(feature = "git")] // Expected output assumes git is enabled
|
|
||||||
fn header_default_is_default() {
|
fn header_default_is_default() {
|
||||||
bat()
|
bat()
|
||||||
.arg("--paging=never")
|
.arg("--paging=never")
|
||||||
@@ -1623,17 +1310,6 @@ fn show_all_extends_tab_markers_to_next_tabstop_width_8() {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn show_all_with_caret_notation() {
|
|
||||||
bat()
|
|
||||||
.arg("--show-all")
|
|
||||||
.arg("--nonprintable-notation=caret")
|
|
||||||
.arg("nonprintable.txt")
|
|
||||||
.assert()
|
|
||||||
.stdout("hello·world^J\n├──┤^M^@^G^H^[")
|
|
||||||
.stderr("");
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn no_paging_arg() {
|
fn no_paging_arg() {
|
||||||
bat()
|
bat()
|
||||||
@@ -1685,7 +1361,6 @@ fn plain_mode_does_not_add_nonexisting_newline() {
|
|||||||
|
|
||||||
// Regression test for https://github.com/sharkdp/bat/issues/299
|
// Regression test for https://github.com/sharkdp/bat/issues/299
|
||||||
#[test]
|
#[test]
|
||||||
#[cfg(feature = "git")] // Expected output assumes git is enabled
|
|
||||||
fn grid_for_file_without_newline() {
|
fn grid_for_file_without_newline() {
|
||||||
bat()
|
bat()
|
||||||
.arg("--paging=never")
|
.arg("--paging=never")
|
||||||
@@ -1730,7 +1405,6 @@ fn ansi_highlight_underline() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Ensure that ANSI passthrough is emitted properly for both wrapping and non-wrapping printer.
|
// Ensure that ANSI passthrough is emitted properly for both wrapping and non-wrapping printer.
|
||||||
// See https://github.com/sharkdp/bat/issues/2307 for what common use case this test tests.
|
|
||||||
#[test]
|
#[test]
|
||||||
fn ansi_passthrough_emit() {
|
fn ansi_passthrough_emit() {
|
||||||
for wrapping in &["never", "character"] {
|
for wrapping in &["never", "character"] {
|
||||||
@@ -1786,105 +1460,6 @@ fn ignored_suffix_arg() {
|
|||||||
.stderr("");
|
.stderr("");
|
||||||
}
|
}
|
||||||
|
|
||||||
fn wrapping_test(wrap_flag: &str, expect_wrap: bool) {
|
|
||||||
let expected = match expect_wrap {
|
|
||||||
true =>
|
|
||||||
"abcdefghigklmnopqrstuvxyzabcdefghigklmnopqrstuvxyzabcdefghigklmnopqrstuvxyzabcde\nfghigklmnopqrstuvxyz\n",
|
|
||||||
false =>
|
|
||||||
"abcdefghigklmnopqrstuvxyzabcdefghigklmnopqrstuvxyzabcdefghigklmnopqrstuvxyzabcdefghigklmnopqrstuvxyz\n",
|
|
||||||
};
|
|
||||||
|
|
||||||
bat()
|
|
||||||
.arg(wrap_flag)
|
|
||||||
.arg("--style=rule")
|
|
||||||
.arg("--color=never")
|
|
||||||
.arg("--decorations=always")
|
|
||||||
.arg("--terminal-width=80")
|
|
||||||
.arg("long-single-line.txt")
|
|
||||||
.assert()
|
|
||||||
.success()
|
|
||||||
.stdout(expected.to_owned())
|
|
||||||
.stderr("");
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn no_line_wrapping_when_set_to_never() {
|
|
||||||
wrapping_test("--wrap=never", false);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn line_wrapping_when_auto() {
|
|
||||||
wrapping_test("--wrap=auto", true);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn no_line_wrapping_with_s_flag() {
|
|
||||||
wrapping_test("-S", false);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn no_wrapping_with_chop_long_lines() {
|
|
||||||
wrapping_test("--chop-long-lines", false);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn theme_arg_overrides_env() {
|
|
||||||
bat()
|
|
||||||
.env("BAT_THEME", "TwoDark")
|
|
||||||
.arg("--paging=never")
|
|
||||||
.arg("--color=never")
|
|
||||||
.arg("--terminal-width=80")
|
|
||||||
.arg("--wrap=never")
|
|
||||||
.arg("--decorations=always")
|
|
||||||
.arg("--theme=ansi")
|
|
||||||
.arg("--style=plain")
|
|
||||||
.arg("--highlight-line=1")
|
|
||||||
.write_stdin("Ansi Underscore Test\nAnother Line")
|
|
||||||
.assert()
|
|
||||||
.success()
|
|
||||||
.stdout("\x1B[4mAnsi Underscore Test\n\x1B[24mAnother Line")
|
|
||||||
.stderr("");
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn theme_arg_overrides_env_withconfig() {
|
|
||||||
bat_with_config()
|
|
||||||
.env("BAT_CONFIG_PATH", "bat-theme.conf")
|
|
||||||
.env("BAT_THEME", "TwoDark")
|
|
||||||
.arg("--paging=never")
|
|
||||||
.arg("--color=never")
|
|
||||||
.arg("--terminal-width=80")
|
|
||||||
.arg("--wrap=never")
|
|
||||||
.arg("--decorations=always")
|
|
||||||
.arg("--theme=ansi")
|
|
||||||
.arg("--style=plain")
|
|
||||||
.arg("--highlight-line=1")
|
|
||||||
.write_stdin("Ansi Underscore Test\nAnother Line")
|
|
||||||
.assert()
|
|
||||||
.success()
|
|
||||||
.stdout("\x1B[4mAnsi Underscore Test\n\x1B[24mAnother Line")
|
|
||||||
.stderr("");
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn theme_env_overrides_config() {
|
|
||||||
bat_with_config()
|
|
||||||
.env("BAT_CONFIG_PATH", "bat-theme.conf")
|
|
||||||
.env("BAT_THEME", "ansi")
|
|
||||||
.arg("--paging=never")
|
|
||||||
.arg("--color=never")
|
|
||||||
.arg("--terminal-width=80")
|
|
||||||
.arg("--wrap=never")
|
|
||||||
.arg("--decorations=always")
|
|
||||||
.arg("--style=plain")
|
|
||||||
.arg("--highlight-line=1")
|
|
||||||
.write_stdin("Ansi Underscore Test\nAnother Line")
|
|
||||||
.assert()
|
|
||||||
.success()
|
|
||||||
.stdout("\x1B[4mAnsi Underscore Test\n\x1B[24mAnother Line")
|
|
||||||
.stderr("");
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn highlighting_is_skipped_on_long_lines() {
|
fn highlighting_is_skipped_on_long_lines() {
|
||||||
let expected = "\u{1b}[38;5;231m{\u{1b}[0m\u{1b}[38;5;208m\"\u{1b}[0m\u{1b}[38;5;208mapi\u{1b}[0m\u{1b}[38;5;208m\"\u{1b}[0m\u{1b}[38;5;231m:\u{1b}[0m\n".to_owned() +
|
let expected = "\u{1b}[38;5;231m{\u{1b}[0m\u{1b}[38;5;208m\"\u{1b}[0m\u{1b}[38;5;208mapi\u{1b}[0m\u{1b}[38;5;208m\"\u{1b}[0m\u{1b}[38;5;231m:\u{1b}[0m\n".to_owned() +
|
||||||
@@ -1949,36 +1524,6 @@ fn all_global_git_config_locations_syntax_mapping_work() {
|
|||||||
.stderr("");
|
.stderr("");
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn map_syntax_and_ignored_suffix_work_together() {
|
|
||||||
bat()
|
|
||||||
.arg("-f")
|
|
||||||
.arg("--theme")
|
|
||||||
.arg("Monokai Extended")
|
|
||||||
.arg("-p")
|
|
||||||
.arg("--ignored-suffix=.suffix")
|
|
||||||
.arg("--map-syntax=*.demo:JSON")
|
|
||||||
.arg("test.demo.suffix")
|
|
||||||
.assert()
|
|
||||||
.success()
|
|
||||||
.stdout("\u{1b}[38;5;231m{\u{1b}[0m\u{1b}[38;5;208m\"\u{1b}[0m\u{1b}[38;5;208mtest\u{1b}[0m\u{1b}[38;5;208m\"\u{1b}[0m\u{1b}[38;5;231m:\u{1b}[0m\u{1b}[38;5;231m \u{1b}[0m\u{1b}[38;5;186m\"\u{1b}[0m\u{1b}[38;5;186mvalue\u{1b}[0m\u{1b}[38;5;186m\"\u{1b}[0m\u{1b}[38;5;231m}\u{1b}[0m")
|
|
||||||
.stderr("");
|
|
||||||
|
|
||||||
bat()
|
|
||||||
.arg("-f")
|
|
||||||
.arg("--theme")
|
|
||||||
.arg("Monokai Extended")
|
|
||||||
.arg("-p")
|
|
||||||
.arg("--ignored-suffix=.suffix")
|
|
||||||
.arg("--ignored-suffix=.foo")
|
|
||||||
.arg("--map-syntax=*.demo:JSON")
|
|
||||||
.arg("test.demo.foo.suffix")
|
|
||||||
.assert()
|
|
||||||
.success()
|
|
||||||
.stdout("\u{1b}[38;5;231m{\u{1b}[0m\u{1b}[38;5;208m\"\u{1b}[0m\u{1b}[38;5;208mtest\u{1b}[0m\u{1b}[38;5;208m\"\u{1b}[0m\u{1b}[38;5;231m:\u{1b}[0m\u{1b}[38;5;231m \u{1b}[0m\u{1b}[38;5;186m\"\u{1b}[0m\u{1b}[38;5;186mvalue\u{1b}[0m\u{1b}[38;5;186m\"\u{1b}[0m\u{1b}[38;5;231m}\u{1b}[0m")
|
|
||||||
.stderr("");
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn acknowledgements() {
|
fn acknowledgements() {
|
||||||
bat()
|
bat()
|
||||||
|
@@ -18,7 +18,7 @@ gpl_occurances=$(git grep --recurse-submodules "${gpl_term}" -- "${gpl_excludes[
|
|||||||
if [ -z "${gpl_occurances}" ]; then
|
if [ -z "${gpl_occurances}" ]; then
|
||||||
echo "PASS: No files under GPL were found"
|
echo "PASS: No files under GPL were found"
|
||||||
else
|
else
|
||||||
echo "FAIL: GPL:ed code is not compatible with bat, but occurrences of '${gpl_term}' were found:"
|
echo "FAIL: GPL:ed code is not compatible with bat, but occurances of '${gpl_term}' were found:"
|
||||||
echo "${gpl_occurances}"
|
echo "${gpl_occurances}"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
@@ -1,13 +1,13 @@
|
|||||||
#[cfg(feature = "git")]
|
|
||||||
mod tester;
|
mod tester;
|
||||||
|
|
||||||
|
use crate::tester::BatTester;
|
||||||
|
|
||||||
macro_rules! snapshot_tests {
|
macro_rules! snapshot_tests {
|
||||||
($($test_name: ident: $style: expr,)*) => {
|
($($test_name: ident: $style: expr,)*) => {
|
||||||
$(
|
$(
|
||||||
#[test]
|
#[test]
|
||||||
#[cfg(feature = "git")]
|
|
||||||
fn $test_name() {
|
fn $test_name() {
|
||||||
let bat_tester = tester::BatTester::default();
|
let bat_tester = BatTester::default();
|
||||||
bat_tester.test_snapshot(stringify!($test_name), $style);
|
bat_tester.test_snapshot(stringify!($test_name), $style);
|
||||||
}
|
}
|
||||||
)*
|
)*
|
||||||
|
308
tests/syntax-tests/highlighted/Ada/click.adb
vendored
308
tests/syntax-tests/highlighted/Ada/click.adb
vendored
@@ -1,308 +0,0 @@
|
|||||||
[38;2;230;219;116mwith Chests.Ring_Buffers;[0m
|
|
||||||
[38;2;230;219;116mwith USB.Device.HID.Keyboard;[0m
|
|
||||||
|
|
||||||
[38;2;249;38;114mpackage[0m[38;2;248;248;242m [0m[38;2;249;38;114mbody[0m[38;2;248;248;242m [0m[38;2;166;226;46mClick[0m[38;2;248;248;242m [0m[38;2;249;38;114mis[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m--------------[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m DEBOUNCE --[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m--------------[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m Ideally, in a separate package.[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m should be [], but not fixed yet in GCC 11.[0m
|
|
||||||
[38;2;249;38;114m [0m[38;2;166;226;46mCurrent_Status[0m[38;2;249;38;114m :[0m[38;2;248;248;242m Key_Matrix := [[0m[38;2;249;38;114mothers[0m[38;2;248;248;242m => [[0m[38;2;249;38;114mothers[0m[38;2;248;248;242m => False]];[0m
|
|
||||||
[38;2;249;38;114m [0m[38;2;166;226;46mNew_Status[0m[38;2;249;38;114m :[0m[38;2;248;248;242m Key_Matrix := [[0m[38;2;249;38;114mothers[0m[38;2;248;248;242m => [[0m[38;2;249;38;114mothers[0m[38;2;248;248;242m => False]];[0m
|
|
||||||
[38;2;249;38;114m [0m[38;2;166;226;46mSince[0m[38;2;249;38;114m :[0m[38;2;248;248;242m Natural := [0m[38;2;190;132;255m0[0m[38;2;248;248;242m;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m Nb_Bounce : Natural := 5;[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mfunction[0m[38;2;248;248;242m [0m[38;2;166;226;46mUpdate[0m[38;2;248;248;242m (NewS : Key_Matrix) [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m Boolean [0m[38;2;249;38;114mis[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mbegin[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m The new state is the same as the current stable state => Do nothing.[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mif[0m[38;2;248;248;242m Current_Status = NewS [0m[38;2;249;38;114mthen[0m
|
|
||||||
[38;2;249;38;114m [0m[38;2;166;226;46mSince[0m[38;2;249;38;114m :[0m[38;2;248;248;242m= [0m[38;2;190;132;255m0[0m[38;2;248;248;242m;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m False;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mend if[0m[38;2;248;248;242m;[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mif[0m[38;2;248;248;242m New_Status /= NewS [0m[38;2;249;38;114mthen[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m The new state differs from the previous[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m new state (bouncing) => reset[0m
|
|
||||||
[38;2;249;38;114m [0m[38;2;166;226;46mNew_Status[0m[38;2;249;38;114m :[0m[38;2;248;248;242m= NewS;[0m
|
|
||||||
[38;2;249;38;114m [0m[38;2;166;226;46mSince[0m[38;2;249;38;114m :[0m[38;2;248;248;242m= [0m[38;2;190;132;255m1[0m[38;2;248;248;242m;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114melse[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m The new state hasn't changed since last[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m update => towards stabilization.[0m
|
|
||||||
[38;2;249;38;114m [0m[38;2;166;226;46mSince[0m[38;2;249;38;114m :[0m[38;2;248;248;242m= Since + [0m[38;2;190;132;255m1[0m[38;2;248;248;242m;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mend if[0m[38;2;248;248;242m;[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mif[0m[38;2;248;248;242m Since > Nb_Bounce [0m[38;2;249;38;114mthen[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mdeclare[0m
|
|
||||||
[38;2;249;38;114m [0m[38;2;166;226;46mTmp[0m[38;2;249;38;114m :[0m[38;2;248;248;242m [0m[38;2;249;38;114mconstant[0m[38;2;248;248;242m Key_Matrix := Current_Status;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mbegin[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m New state has been stable enough.[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m Latch it and notifies caller.[0m
|
|
||||||
[38;2;249;38;114m [0m[38;2;166;226;46mCurrent_Status[0m[38;2;249;38;114m :[0m[38;2;248;248;242m= New_Status;[0m
|
|
||||||
[38;2;249;38;114m [0m[38;2;166;226;46mNew_Status[0m[38;2;249;38;114m :[0m[38;2;248;248;242m= Tmp;[0m
|
|
||||||
[38;2;249;38;114m [0m[38;2;166;226;46mSince[0m[38;2;249;38;114m :[0m[38;2;248;248;242m= [0m[38;2;190;132;255m0[0m[38;2;248;248;242m;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mend[0m[38;2;248;248;242m;[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m True;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114melse[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m Not there yet[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m False;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mend if[0m[38;2;248;248;242m;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mend[0m[38;2;248;248;242m [0m[38;2;166;226;46mUpdate[0m[38;2;248;248;242m;[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mprocedure[0m[38;2;248;248;242m [0m[38;2;166;226;46mGet_Matrix[0m[38;2;248;248;242m;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m Could use := []; but GNAT 12 has a bug (fixed in upcoming 13)[0m
|
|
||||||
[38;2;249;38;114m [0m[38;2;166;226;46mRead_Status[0m[38;2;249;38;114m :[0m[38;2;248;248;242m Key_Matrix := [[0m[38;2;249;38;114mothers[0m[38;2;248;248;242m => [[0m[38;2;249;38;114mothers[0m[38;2;248;248;242m => False]];[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mfunction[0m[38;2;248;248;242m [0m[38;2;166;226;46mGet_Events[0m[38;2;248;248;242m [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m Events [0m[38;2;249;38;114mis[0m
|
|
||||||
[38;2;249;38;114m [0m[38;2;166;226;46mNum_Evt[0m[38;2;249;38;114m :[0m[38;2;248;248;242m Natural := [0m[38;2;190;132;255m0[0m[38;2;248;248;242m;[0m
|
|
||||||
[38;2;249;38;114m [0m[38;2;166;226;46mNew_S[0m[38;2;249;38;114m :[0m[38;2;248;248;242m Key_Matrix [0m[38;2;249;38;114mrenames[0m[38;2;248;248;242m Read_Status;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mbegin[0m
|
|
||||||
[38;2;248;248;242m Get_Matrix;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mif[0m[38;2;248;248;242m Update (New_S) [0m[38;2;249;38;114mthen[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mfor[0m[38;2;248;248;242m I [0m[38;2;249;38;114min[0m[38;2;248;248;242m Current_Status'[0m[38;2;249;38;114mRange[0m[38;2;248;248;242m ([0m[38;2;190;132;255m1[0m[38;2;248;248;242m) [0m[38;2;249;38;114mloop[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mfor[0m[38;2;248;248;242m J [0m[38;2;249;38;114min[0m[38;2;248;248;242m Current_Status'[0m[38;2;249;38;114mRange[0m[38;2;248;248;242m ([0m[38;2;190;132;255m2[0m[38;2;248;248;242m) [0m[38;2;249;38;114mloop[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mif[0m[38;2;248;248;242m ([0m[38;2;249;38;114mnot[0m[38;2;248;248;242m New_Status (I, J) [0m[38;2;249;38;114mand[0m[38;2;248;248;242m [0m[38;2;249;38;114mthen[0m[38;2;248;248;242m Current_Status (I, J))[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mor[0m[38;2;248;248;242m [0m[38;2;249;38;114melse[0m[38;2;248;248;242m (New_Status (I, J) [0m[38;2;249;38;114mand[0m[38;2;248;248;242m [0m[38;2;249;38;114mthen[0m[38;2;248;248;242m [0m[38;2;249;38;114mnot[0m[38;2;248;248;242m Current_Status (I, J))[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mthen[0m
|
|
||||||
[38;2;249;38;114m [0m[38;2;166;226;46mNum_Evt[0m[38;2;249;38;114m :[0m[38;2;248;248;242m= Num_Evt + [0m[38;2;190;132;255m1[0m[38;2;248;248;242m;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mend if[0m[38;2;248;248;242m;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mend loop[0m[38;2;248;248;242m;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mend loop[0m[38;2;248;248;242m;[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mdeclare[0m
|
|
||||||
[38;2;249;38;114m [0m[38;2;166;226;46mEvts[0m[38;2;249;38;114m :[0m[38;2;248;248;242m Events (Natural [0m[38;2;249;38;114mrange[0m[38;2;248;248;242m [0m[38;2;190;132;255m1[0m[38;2;248;248;242m .. Num_Evt);[0m
|
|
||||||
[38;2;249;38;114m [0m[38;2;166;226;46mCursor[0m[38;2;249;38;114m :[0m[38;2;248;248;242m Natural [0m[38;2;249;38;114mrange[0m[38;2;248;248;242m [0m[38;2;190;132;255m1[0m[38;2;248;248;242m .. Num_Evt + [0m[38;2;190;132;255m1[0m[38;2;248;248;242m := [0m[38;2;190;132;255m1[0m[38;2;248;248;242m;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mbegin[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mfor[0m[38;2;248;248;242m I [0m[38;2;249;38;114min[0m[38;2;248;248;242m Current_Status'[0m[38;2;249;38;114mRange[0m[38;2;248;248;242m ([0m[38;2;190;132;255m1[0m[38;2;248;248;242m) [0m[38;2;249;38;114mloop[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mfor[0m[38;2;248;248;242m J [0m[38;2;249;38;114min[0m[38;2;248;248;242m Current_Status'[0m[38;2;249;38;114mRange[0m[38;2;248;248;242m ([0m[38;2;190;132;255m2[0m[38;2;248;248;242m) [0m[38;2;249;38;114mloop[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mif[0m[38;2;248;248;242m [0m[38;2;249;38;114mnot[0m[38;2;248;248;242m New_Status (I, J)[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mand[0m[38;2;248;248;242m [0m[38;2;249;38;114mthen[0m[38;2;248;248;242m Current_Status (I, J)[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mthen[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m Pressing I, J[0m
|
|
||||||
[38;2;248;248;242m Evts (Cursor) := [[0m
|
|
||||||
[38;2;248;248;242m Evt => Press,[0m
|
|
||||||
[38;2;248;248;242m Col => I,[0m
|
|
||||||
[38;2;248;248;242m Row => J[0m
|
|
||||||
[38;2;248;248;242m ];[0m
|
|
||||||
[38;2;249;38;114m [0m[38;2;166;226;46mCursor[0m[38;2;249;38;114m :[0m[38;2;248;248;242m= Cursor + [0m[38;2;190;132;255m1[0m[38;2;248;248;242m;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114melsif[0m[38;2;248;248;242m New_Status (I, J)[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mand[0m[38;2;248;248;242m [0m[38;2;249;38;114mthen[0m[38;2;248;248;242m [0m[38;2;249;38;114mnot[0m[38;2;248;248;242m Current_Status (I, J)[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mthen[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m Release I, J[0m
|
|
||||||
[38;2;248;248;242m Evts (Cursor) := [[0m
|
|
||||||
[38;2;248;248;242m Evt => Release,[0m
|
|
||||||
[38;2;248;248;242m Col => I,[0m
|
|
||||||
[38;2;248;248;242m Row => J[0m
|
|
||||||
[38;2;248;248;242m ];[0m
|
|
||||||
[38;2;249;38;114m [0m[38;2;166;226;46mCursor[0m[38;2;249;38;114m :[0m[38;2;248;248;242m= Cursor + [0m[38;2;190;132;255m1[0m[38;2;248;248;242m;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mend if[0m[38;2;248;248;242m;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mend loop[0m[38;2;248;248;242m;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mend loop[0m[38;2;248;248;242m;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m Evts;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mend[0m[38;2;248;248;242m;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mend if[0m[38;2;248;248;242m;[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m [];[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mend[0m[38;2;248;248;242m [0m[38;2;166;226;46mGet_Events[0m[38;2;248;248;242m;[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mprocedure[0m[38;2;248;248;242m [0m[38;2;166;226;46mGet_Matrix[0m[38;2;248;248;242m [0m[38;2;249;38;114mis[0m[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m return Key_Matrix is[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mbegin[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mfor[0m[38;2;248;248;242m Row [0m[38;2;249;38;114min[0m[38;2;248;248;242m Keys.Rows'[0m[38;2;249;38;114mRange[0m[38;2;248;248;242m [0m[38;2;249;38;114mloop[0m
|
|
||||||
[38;2;248;248;242m Keys.Rows (Row).Clear;[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mfor[0m[38;2;248;248;242m Col [0m[38;2;249;38;114min[0m[38;2;248;248;242m Keys.Cols'[0m[38;2;249;38;114mRange[0m[38;2;248;248;242m [0m[38;2;249;38;114mloop[0m
|
|
||||||
[38;2;248;248;242m Read_Status (Col, Row) := [0m[38;2;249;38;114mnot[0m[38;2;248;248;242m Keys.Cols (Col).Set;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mend loop[0m[38;2;248;248;242m;[0m
|
|
||||||
[38;2;248;248;242m Keys.Rows (Row).Set;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mend loop[0m[38;2;248;248;242m;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mend[0m[38;2;248;248;242m [0m[38;2;166;226;46mGet_Matrix[0m[38;2;248;248;242m;[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m End of DEBOUNCE[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m------------[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m Layout --[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m------------[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mpackage[0m[38;2;248;248;242m [0m[38;2;166;226;46mEvents_Ring_Buffers[0m[38;2;248;248;242m [0m[38;2;249;38;114mis[0m[38;2;248;248;242m [0m[38;2;249;38;114mnew[0m[38;2;248;248;242m Chests.Ring_Buffers[0m
|
|
||||||
[38;2;248;248;242m (Element_Type => Event,[0m
|
|
||||||
[38;2;248;248;242m Capacity => [0m[38;2;190;132;255m16[0m[38;2;248;248;242m);[0m
|
|
||||||
|
|
||||||
[38;2;249;38;114m [0m[38;2;166;226;46mQueued_Events[0m[38;2;249;38;114m :[0m[38;2;248;248;242m Events_Ring_Buffers.Ring_Buffer;[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mtype[0m[38;2;248;248;242m Statet [0m[38;2;249;38;114mis[0m[38;2;248;248;242m (Normal_Key, Layer_Mod, None);[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mtype[0m[38;2;248;248;242m State [0m[38;2;249;38;114mis[0m[38;2;248;248;242m [0m[38;2;249;38;114mrecord[0m
|
|
||||||
[38;2;249;38;114m [0m[38;2;166;226;46mTyp[0m[38;2;249;38;114m :[0m[38;2;248;248;242m Statet;[0m
|
|
||||||
[38;2;249;38;114m [0m[38;2;166;226;46mCode[0m[38;2;249;38;114m :[0m[38;2;248;248;242m Key_Code_T;[0m
|
|
||||||
[38;2;249;38;114m [0m[38;2;166;226;46mLayer_Value[0m[38;2;249;38;114m :[0m[38;2;248;248;242m Natural;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m Col : ColR;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m Row : RowR;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mend record[0m[38;2;248;248;242m;[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mtype[0m[38;2;248;248;242m State_Array [0m[38;2;249;38;114mis[0m[38;2;248;248;242m [0m[38;2;249;38;114marray[0m[38;2;248;248;242m (ColR, RowR) [0m[38;2;249;38;114mof[0m[38;2;248;248;242m State;[0m
|
|
||||||
[38;2;249;38;114m [0m[38;2;166;226;46mStates[0m[38;2;249;38;114m :[0m[38;2;248;248;242m State_Array := [[0m[38;2;249;38;114mothers[0m[38;2;248;248;242m => [[0m[38;2;249;38;114mothers[0m[38;2;248;248;242m => (Typ => None, Code => No, Layer_Value => [0m[38;2;190;132;255m0[0m[38;2;248;248;242m)]];[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mfunction[0m[38;2;248;248;242m [0m[38;2;166;226;46mKw[0m[38;2;248;248;242m (Code : Key_Code_T) [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m Action [0m[38;2;249;38;114mis[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mbegin[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m (T => Key, C => Code, L => [0m[38;2;190;132;255m0[0m[38;2;248;248;242m);[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mend[0m[38;2;248;248;242m [0m[38;2;166;226;46mKw[0m[38;2;248;248;242m;[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mfunction[0m[38;2;248;248;242m [0m[38;2;166;226;46mLw[0m[38;2;248;248;242m (V : Natural) [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m Action [0m[38;2;249;38;114mis[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mbegin[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m (T => Layer, C => No, L => V);[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mend[0m[38;2;248;248;242m [0m[38;2;166;226;46mLw[0m[38;2;248;248;242m;[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m FIXME: hardcoded max number of events[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114msubtype[0m[38;2;248;248;242m Events_Range [0m[38;2;249;38;114mis[0m[38;2;248;248;242m Natural [0m[38;2;249;38;114mrange[0m[38;2;248;248;242m [0m[38;2;190;132;255m0[0m[38;2;248;248;242m .. [0m[38;2;190;132;255m60[0m[38;2;248;248;242m;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mtype[0m[38;2;248;248;242m Array_Of_Reg_Events [0m[38;2;249;38;114mis[0m[38;2;248;248;242m [0m[38;2;249;38;114marray[0m[38;2;248;248;242m (Events_Range) [0m[38;2;249;38;114mof[0m[38;2;248;248;242m Event;[0m
|
|
||||||
|
|
||||||
[38;2;249;38;114m [0m[38;2;166;226;46mStamp[0m[38;2;249;38;114m :[0m[38;2;248;248;242m Natural := [0m[38;2;190;132;255m0[0m[38;2;248;248;242m;[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mprocedure[0m[38;2;248;248;242m [0m[38;2;166;226;46mRegister_Events[0m[38;2;248;248;242m (L : Layout; Es : Events) [0m[38;2;249;38;114mis[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mbegin[0m
|
|
||||||
[38;2;249;38;114m [0m[38;2;166;226;46mStamp[0m[38;2;249;38;114m :[0m[38;2;248;248;242m= Stamp + [0m[38;2;190;132;255m1[0m[38;2;248;248;242m;[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m Log ([0m[38;2;230;219;116m"[0m[38;2;230;219;116mReg events: [0m[38;2;230;219;116m"[0m[38;2;248;248;242m & Stamp'Image);[0m
|
|
||||||
[38;2;248;248;242m Log (Es'Length'Image);[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mfor[0m[38;2;248;248;242m E [0m[38;2;249;38;114mof[0m[38;2;248;248;242m Es [0m[38;2;249;38;114mloop[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mdeclare[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mbegin[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mif[0m[38;2;248;248;242m Events_Ring_Buffers.Is_Full (Queued_Events) [0m[38;2;249;38;114mthen[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mraise[0m[38;2;248;248;242m Program_Error;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mend if[0m[38;2;248;248;242m;[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m Events_Ring_Buffers.Append (Queued_Events, E);[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mend[0m[38;2;248;248;242m;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m Log ("Reg'ed events:" & Events_Mark'Image);[0m
|
|
||||||
[38;2;248;248;242m Log ([0m[38;2;230;219;116m"[0m[38;2;230;219;116mReg'ed events:[0m[38;2;230;219;116m"[0m[38;2;248;248;242m & Events_Ring_Buffers.Length (Queued_Events)'Image);[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mend loop[0m[38;2;248;248;242m;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mend[0m[38;2;248;248;242m [0m[38;2;166;226;46mRegister_Events[0m[38;2;248;248;242m;[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mprocedure[0m[38;2;248;248;242m [0m[38;2;166;226;46mRelease[0m[38;2;248;248;242m (Col: Colr; Row: Rowr) [0m[38;2;249;38;114mis[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mbegin[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mif[0m[38;2;248;248;242m States (Col, Row).Typ = None [0m[38;2;249;38;114mthen[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mraise[0m[38;2;248;248;242m Program_Error;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mend if[0m[38;2;248;248;242m;[0m
|
|
||||||
[38;2;248;248;242m States (Col, Row) := (Typ => None, Code => No, Layer_Value => [0m[38;2;190;132;255m0[0m[38;2;248;248;242m);[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mend[0m[38;2;248;248;242m [0m[38;2;166;226;46mRelease[0m[38;2;248;248;242m;[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mfunction[0m[38;2;248;248;242m [0m[38;2;166;226;46mGet_Current_Layer[0m[38;2;248;248;242m [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m Natural [0m[38;2;249;38;114mis[0m
|
|
||||||
[38;2;249;38;114m [0m[38;2;166;226;46mL[0m[38;2;249;38;114m :[0m[38;2;248;248;242m Natural := [0m[38;2;190;132;255m0[0m[38;2;248;248;242m;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mbegin[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mfor[0m[38;2;248;248;242m S [0m[38;2;249;38;114mof[0m[38;2;248;248;242m States [0m[38;2;249;38;114mloop[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mif[0m[38;2;248;248;242m S.Typ = Layer_Mod [0m[38;2;249;38;114mthen[0m
|
|
||||||
[38;2;249;38;114m [0m[38;2;166;226;46mL[0m[38;2;249;38;114m :[0m[38;2;248;248;242m= L + S.Layer_Value;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mend if[0m[38;2;248;248;242m;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mend loop[0m[38;2;248;248;242m;[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m L;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mend[0m[38;2;248;248;242m [0m[38;2;166;226;46mGet_Current_Layer[0m[38;2;248;248;242m;[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m Tick the event.[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m Returns TRUE if it needs to stay in the queued events[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m FALSE if the event has been consumed.[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mfunction[0m[38;2;248;248;242m [0m[38;2;166;226;46mTick[0m[38;2;248;248;242m (L: Layout; E : [0m[38;2;249;38;114min[0m[38;2;248;248;242m [0m[38;2;249;38;114mout[0m[38;2;248;248;242m Event) [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m Boolean [0m[38;2;249;38;114mis[0m
|
|
||||||
[38;2;249;38;114m [0m[38;2;166;226;46mCurrent_Layer[0m[38;2;249;38;114m :[0m[38;2;248;248;242m Natural := Get_Current_Layer;[0m
|
|
||||||
[38;2;249;38;114m [0m[38;2;166;226;46mA[0m[38;2;249;38;114m :[0m[38;2;248;248;242m Action [0m[38;2;249;38;114mrenames[0m[38;2;248;248;242m L (Current_Layer, E.Row, E.Col);[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mbegin[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mcase[0m[38;2;248;248;242m E.Evt [0m[38;2;249;38;114mis[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mwhen[0m[38;2;248;248;242m Press =>[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mcase[0m[38;2;248;248;242m A.T [0m[38;2;249;38;114mis[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mwhen[0m[38;2;248;248;242m Key =>[0m
|
|
||||||
[38;2;248;248;242m States (E.Col, E.Row) :=[0m
|
|
||||||
[38;2;248;248;242m (Typ => Normal_Key,[0m
|
|
||||||
[38;2;248;248;242m Code => A.C,[0m
|
|
||||||
[38;2;248;248;242m Layer_Value => [0m[38;2;190;132;255m0[0m[38;2;248;248;242m);[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mwhen[0m[38;2;248;248;242m Layer =>[0m
|
|
||||||
[38;2;248;248;242m States (E.Col, E.Row) := (Typ => Layer_Mod, Layer_Value => A.L, Code => No);[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mwhen[0m[38;2;248;248;242m [0m[38;2;249;38;114mothers[0m[38;2;248;248;242m =>[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mraise[0m[38;2;248;248;242m Program_Error;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mend case[0m[38;2;248;248;242m;[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mwhen[0m[38;2;248;248;242m Release =>[0m
|
|
||||||
[38;2;248;248;242m Release (E.Col, E.Row);[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mend case[0m[38;2;248;248;242m;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m False;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mend[0m[38;2;248;248;242m [0m[38;2;166;226;46mTick[0m[38;2;248;248;242m;[0m
|
|
||||||
|
|
||||||
[38;2;249;38;114m [0m[38;2;166;226;46mLast_Was_Empty_Log[0m[38;2;249;38;114m :[0m[38;2;248;248;242m Boolean := False;[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mprocedure[0m[38;2;248;248;242m [0m[38;2;166;226;46mTick[0m[38;2;248;248;242m (L : Layout) [0m[38;2;249;38;114mis[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mbegin[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mfor[0m[38;2;248;248;242m I [0m[38;2;249;38;114min[0m[38;2;248;248;242m [0m[38;2;190;132;255m1[0m[38;2;248;248;242m .. Events_Ring_Buffers.Length(Queued_Events) [0m[38;2;249;38;114mloop[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mdeclare[0m
|
|
||||||
[38;2;249;38;114m [0m[38;2;166;226;46mE[0m[38;2;249;38;114m :[0m[38;2;248;248;242m Event := Events_Ring_Buffers.Last_Element (Queued_Events);[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mbegin[0m
|
|
||||||
[38;2;248;248;242m Events_Ring_Buffers.Delete_Last (Queued_Events);[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mif[0m[38;2;248;248;242m Tick (L, E) [0m[38;2;249;38;114mthen[0m
|
|
||||||
[38;2;248;248;242m Events_Ring_Buffers.Prepend (Queued_Events, E);[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mend if[0m[38;2;248;248;242m;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mend[0m[38;2;248;248;242m;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mend loop[0m[38;2;248;248;242m;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mif[0m[38;2;248;248;242m [0m[38;2;249;38;114mnot[0m[38;2;248;248;242m Last_Was_Empty_Log [0m[38;2;249;38;114mor[0m[38;2;248;248;242m [0m[38;2;249;38;114melse[0m[38;2;248;248;242m Events_Ring_Buffers.Length(Queued_Events) /= [0m[38;2;190;132;255m0[0m[38;2;248;248;242m [0m[38;2;249;38;114mthen[0m
|
|
||||||
[38;2;248;248;242m Log ([0m[38;2;230;219;116m"[0m[38;2;230;219;116mEnd Tick layout, events: [0m[38;2;230;219;116m"[0m[38;2;248;248;242m & Events_Ring_Buffers.Length(Queued_Events)'Image);[0m
|
|
||||||
[38;2;249;38;114m [0m[38;2;166;226;46mLast_Was_Empty_Log[0m[38;2;249;38;114m :[0m[38;2;248;248;242m= Events_Ring_Buffers.Length(Queued_Events) = [0m[38;2;190;132;255m0[0m[38;2;248;248;242m;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mend if[0m[38;2;248;248;242m;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mend[0m[38;2;248;248;242m [0m[38;2;166;226;46mTick[0m[38;2;248;248;242m;[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mfunction[0m[38;2;248;248;242m [0m[38;2;166;226;46mGet_Key_Codes[0m[38;2;248;248;242m [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m Key_Codes_T [0m[38;2;249;38;114mis[0m
|
|
||||||
[38;2;249;38;114m [0m[38;2;166;226;46mCodes[0m[38;2;249;38;114m :[0m[38;2;248;248;242m Key_Codes_T ([0m[38;2;190;132;255m0[0m[38;2;248;248;242m .. [0m[38;2;190;132;255m10[0m[38;2;248;248;242m);[0m
|
|
||||||
[38;2;249;38;114m [0m[38;2;166;226;46mWm[0m[38;2;249;38;114m:[0m[38;2;248;248;242m Natural := [0m[38;2;190;132;255m0[0m[38;2;248;248;242m;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mbegin[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mfor[0m[38;2;248;248;242m S [0m[38;2;249;38;114mof[0m[38;2;248;248;242m States [0m[38;2;249;38;114mloop[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mif[0m[38;2;248;248;242m S.Typ = Normal_Key [0m[38;2;249;38;114mand[0m[38;2;248;248;242m [0m[38;2;249;38;114mthen[0m
|
|
||||||
[38;2;248;248;242m (S.Code < LCtrl [0m[38;2;249;38;114mor[0m[38;2;248;248;242m [0m[38;2;249;38;114melse[0m[38;2;248;248;242m S.Code > RGui)[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mthen[0m
|
|
||||||
[38;2;248;248;242m Codes (Wm) := S.Code;[0m
|
|
||||||
[38;2;249;38;114m [0m[38;2;166;226;46mWm[0m[38;2;249;38;114m :[0m[38;2;248;248;242m= Wm + [0m[38;2;190;132;255m1[0m[38;2;248;248;242m;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mend if[0m[38;2;248;248;242m;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mend loop[0m[38;2;248;248;242m;[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mif[0m[38;2;248;248;242m Wm = [0m[38;2;190;132;255m0[0m[38;2;248;248;242m [0m[38;2;249;38;114mthen[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m [];[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114melse[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m Codes ([0m[38;2;190;132;255m0[0m[38;2;248;248;242m .. Wm - [0m[38;2;190;132;255m1[0m[38;2;248;248;242m);[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mend if[0m[38;2;248;248;242m;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mend[0m[38;2;248;248;242m [0m[38;2;166;226;46mGet_Key_Codes[0m[38;2;248;248;242m;[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mfunction[0m[38;2;248;248;242m [0m[38;2;166;226;46mGet_Modifiers[0m[38;2;248;248;242m [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m Key_Modifiers [0m[38;2;249;38;114mis[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114muse[0m[38;2;248;248;242m USB.Device.HID.Keyboard;[0m
|
|
||||||
[38;2;249;38;114m [0m[38;2;166;226;46mKM[0m[38;2;249;38;114m :[0m[38;2;248;248;242m Key_Modifiers ([0m[38;2;190;132;255m1[0m[38;2;248;248;242m..[0m[38;2;190;132;255m8[0m[38;2;248;248;242m);[0m
|
|
||||||
[38;2;249;38;114m [0m[38;2;166;226;46mI[0m[38;2;249;38;114m :[0m[38;2;248;248;242m Natural := [0m[38;2;190;132;255m0[0m[38;2;248;248;242m;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mbegin[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mfor[0m[38;2;248;248;242m S [0m[38;2;249;38;114mof[0m[38;2;248;248;242m States [0m[38;2;249;38;114mloop[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mif[0m[38;2;248;248;242m S.Typ = Normal_Key [0m[38;2;249;38;114mthen[0m
|
|
||||||
[38;2;249;38;114m [0m[38;2;166;226;46mI[0m[38;2;249;38;114m :[0m[38;2;248;248;242m= I + [0m[38;2;190;132;255m1[0m[38;2;248;248;242m;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mcase[0m[38;2;248;248;242m S.Code [0m[38;2;249;38;114mis[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mwhen[0m[38;2;248;248;242m LCtrl =>[0m
|
|
||||||
[38;2;248;248;242m KM(I) := Ctrl_Left;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mwhen[0m[38;2;248;248;242m RCtrl =>[0m
|
|
||||||
[38;2;248;248;242m KM(I) := Ctrl_Right;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mwhen[0m[38;2;248;248;242m LShift =>[0m
|
|
||||||
[38;2;248;248;242m KM(I) := Shift_Left;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mwhen[0m[38;2;248;248;242m RShift =>[0m
|
|
||||||
[38;2;248;248;242m KM(I) := Shift_Right;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mwhen[0m[38;2;248;248;242m LAlt =>[0m
|
|
||||||
[38;2;248;248;242m KM(I) := Alt_Left;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mwhen[0m[38;2;248;248;242m RAlt =>[0m
|
|
||||||
[38;2;248;248;242m KM(I) := Alt_Right;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mwhen[0m[38;2;248;248;242m LGui =>[0m
|
|
||||||
[38;2;248;248;242m KM(I) := Meta_Left;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mwhen[0m[38;2;248;248;242m RGui =>[0m
|
|
||||||
[38;2;248;248;242m KM(I) := Meta_Right;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mwhen[0m[38;2;248;248;242m [0m[38;2;249;38;114mothers[0m[38;2;248;248;242m =>[0m
|
|
||||||
[38;2;249;38;114m [0m[38;2;166;226;46mI[0m[38;2;249;38;114m :[0m[38;2;248;248;242m= I - [0m[38;2;190;132;255m1[0m[38;2;248;248;242m;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mend case[0m[38;2;248;248;242m;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mend if[0m[38;2;248;248;242m;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mend loop[0m[38;2;248;248;242m;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m KM ([0m[38;2;190;132;255m1[0m[38;2;248;248;242m..I);[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mend[0m[38;2;248;248;242m [0m[38;2;166;226;46mGet_Modifiers[0m[38;2;248;248;242m;[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mprocedure[0m[38;2;248;248;242m [0m[38;2;166;226;46mInit[0m[38;2;248;248;242m [0m[38;2;249;38;114mis[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mbegin[0m
|
|
||||||
[38;2;248;248;242m Events_Ring_Buffers.Clear (Queued_Events);[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mend[0m[38;2;248;248;242m [0m[38;2;166;226;46mInit[0m[38;2;248;248;242m;[0m
|
|
||||||
|
|
||||||
[38;2;249;38;114mend[0m[38;2;248;248;242m [0m[38;2;166;226;46mClick[0m[38;2;248;248;242m;[0m
|
|
339
tests/syntax-tests/highlighted/Ada/click.ads
vendored
339
tests/syntax-tests/highlighted/Ada/click.ads
vendored
@@ -1,339 +0,0 @@
|
|||||||
[38;2;230;219;116mwith HAL.GPIO;[0m
|
|
||||||
[38;2;230;219;116mwith USB.Device.HID.Keyboard;[0m
|
|
||||||
|
|
||||||
[38;2;249;38;114mgeneric[0m
|
|
||||||
[38;2;249;38;114m [0m[38;2;166;226;46mNb_Bounce[0m[38;2;249;38;114m :[0m[38;2;248;248;242m Natural;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mtype[0m[38;2;248;248;242m ColR [0m[38;2;249;38;114mis[0m[38;2;248;248;242m (<>);[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mtype[0m[38;2;248;248;242m RowR [0m[38;2;249;38;114mis[0m[38;2;248;248;242m (<>);[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mtype[0m[38;2;248;248;242m GPIOP [0m[38;2;249;38;114mis[0m[38;2;248;248;242m [0m[38;2;249;38;114mnew[0m[38;2;248;248;242m HAL.GPIO.GPIO_Point [0m[38;2;249;38;114mwith[0m[38;2;248;248;242m [0m[38;2;249;38;114mprivate[0m[38;2;248;248;242m;[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mtype[0m[38;2;248;248;242m Cols_T [0m[38;2;249;38;114mis[0m[38;2;248;248;242m [0m[38;2;249;38;114marray[0m[38;2;248;248;242m (ColR) [0m[38;2;249;38;114mof[0m[38;2;248;248;242m GPIOP;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mtype[0m[38;2;248;248;242m Rows_T [0m[38;2;249;38;114mis[0m[38;2;248;248;242m [0m[38;2;249;38;114marray[0m[38;2;248;248;242m (RowR) [0m[38;2;249;38;114mof[0m[38;2;248;248;242m GPIOP;[0m
|
|
||||||
|
|
||||||
[38;2;249;38;114m [0m[38;2;166;226;46mCols[0m[38;2;249;38;114m :[0m[38;2;248;248;242m Cols_T;[0m
|
|
||||||
[38;2;249;38;114m [0m[38;2;166;226;46mRows[0m[38;2;249;38;114m :[0m[38;2;248;248;242m Rows_T;[0m
|
|
||||||
[38;2;249;38;114m [0m[38;2;166;226;46mNum_Layers[0m[38;2;249;38;114m :[0m[38;2;248;248;242m Natural;[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mwith[0m[38;2;248;248;242m [0m[38;2;249;38;114mprocedure[0m[38;2;248;248;242m [0m[38;2;166;226;46mLog[0m[38;2;248;248;242m (S : String; L : Integer := [0m[38;2;190;132;255m1[0m[38;2;248;248;242m; Deindent : Integer := [0m[38;2;190;132;255m0[0m[38;2;248;248;242m);[0m
|
|
||||||
[38;2;249;38;114mpackage[0m[38;2;248;248;242m [0m[38;2;166;226;46mClick[0m[38;2;248;248;242m [0m[38;2;249;38;114mis[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mtype[0m[38;2;248;248;242m Keys_T [0m[38;2;249;38;114mis[0m[38;2;248;248;242m [0m[38;2;249;38;114mrecord[0m
|
|
||||||
[38;2;249;38;114m [0m[38;2;166;226;46mCols[0m[38;2;249;38;114m :[0m[38;2;248;248;242m Cols_T;[0m
|
|
||||||
[38;2;249;38;114m [0m[38;2;166;226;46mRows[0m[38;2;249;38;114m :[0m[38;2;248;248;242m Rows_T;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mend record[0m[38;2;248;248;242m;[0m
|
|
||||||
|
|
||||||
[38;2;249;38;114m [0m[38;2;166;226;46mKeys[0m[38;2;249;38;114m :[0m[38;2;248;248;242m Keys_T :=[0m
|
|
||||||
[38;2;248;248;242m (Rows => Rows, Cols => Cols);[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mtype[0m[38;2;248;248;242m Key_Matrix [0m[38;2;249;38;114mis[0m[38;2;248;248;242m [0m[38;2;249;38;114marray[0m[38;2;248;248;242m (ColR, RowR) [0m[38;2;249;38;114mof[0m[38;2;248;248;242m Boolean;[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m------------------------[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m Events & Debouncing --[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m------------------------[0m
|
|
||||||
|
|
||||||
[38;2;249;38;114m [0m[38;2;166;226;46mMaxEvents[0m[38;2;249;38;114m :[0m[38;2;248;248;242m [0m[38;2;249;38;114mconstant[0m[38;2;248;248;242m Positive := [0m[38;2;190;132;255m20[0m[38;2;248;248;242m;[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mtype[0m[38;2;248;248;242m EventT [0m[38;2;249;38;114mis[0m[38;2;248;248;242m (Press, Release);[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mtype[0m[38;2;248;248;242m Event [0m[38;2;249;38;114mis[0m[38;2;248;248;242m [0m[38;2;249;38;114mrecord[0m
|
|
||||||
[38;2;249;38;114m [0m[38;2;166;226;46mEvt[0m[38;2;249;38;114m :[0m[38;2;248;248;242m EventT;[0m
|
|
||||||
[38;2;249;38;114m [0m[38;2;166;226;46mCol[0m[38;2;249;38;114m :[0m[38;2;248;248;242m ColR;[0m
|
|
||||||
[38;2;249;38;114m [0m[38;2;166;226;46mRow[0m[38;2;249;38;114m :[0m[38;2;248;248;242m RowR;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mend record[0m[38;2;248;248;242m;[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mtype[0m[38;2;248;248;242m Events [0m[38;2;249;38;114mis[0m[38;2;248;248;242m [0m[38;2;249;38;114marray[0m[38;2;248;248;242m (Natural [0m[38;2;249;38;114mrange[0m[38;2;248;248;242m <>) [0m[38;2;249;38;114mof[0m[38;2;248;248;242m Event;[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mfunction[0m[38;2;248;248;242m [0m[38;2;166;226;46mGet_Events[0m[38;2;248;248;242m [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m Events;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mfunction[0m[38;2;248;248;242m [0m[38;2;166;226;46mUpdate[0m[38;2;248;248;242m (NewS : Key_Matrix) [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m Boolean;[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m-----------[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m Layout --[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m-----------[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m-------------[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m Keycodes --[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m-------------[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m Keycodes copy/pasted from the excelent Keyberon Rust firmware:[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m https://github.com/TeXitoi/keyberon/[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mtype[0m[38;2;248;248;242m Key_Code_T [0m[38;2;249;38;114mis[0m
|
|
||||||
[38;2;248;248;242m ([0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m The "no" key, a placeholder to express nothing.[0m
|
|
||||||
[38;2;248;248;242m No, [0m[38;2;117;113;94m--[0m[38;2;117;113;94m = 0x00,[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m / Error if too much keys are pressed at[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m the same time.[0m
|
|
||||||
[38;2;248;248;242m ErrorRollOver,[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m / The POST fail error.[0m
|
|
||||||
[38;2;248;248;242m PostFail,[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m / An undefined error occured.[0m
|
|
||||||
[38;2;248;248;242m ErrorUndefined,[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m / `a` and `A`.[0m
|
|
||||||
[38;2;248;248;242m A,[0m
|
|
||||||
[38;2;248;248;242m B,[0m
|
|
||||||
[38;2;248;248;242m C,[0m
|
|
||||||
[38;2;248;248;242m D,[0m
|
|
||||||
[38;2;248;248;242m E,[0m
|
|
||||||
[38;2;248;248;242m F,[0m
|
|
||||||
[38;2;248;248;242m G,[0m
|
|
||||||
[38;2;248;248;242m H,[0m
|
|
||||||
[38;2;248;248;242m I,[0m
|
|
||||||
[38;2;248;248;242m J,[0m
|
|
||||||
[38;2;248;248;242m K,[0m
|
|
||||||
[38;2;248;248;242m L,[0m
|
|
||||||
[38;2;248;248;242m M, [0m[38;2;117;113;94m--[0m[38;2;117;113;94m 0x10[0m
|
|
||||||
[38;2;248;248;242m N,[0m
|
|
||||||
[38;2;248;248;242m O,[0m
|
|
||||||
[38;2;248;248;242m P,[0m
|
|
||||||
[38;2;248;248;242m Q,[0m
|
|
||||||
[38;2;248;248;242m R,[0m
|
|
||||||
[38;2;248;248;242m S,[0m
|
|
||||||
[38;2;248;248;242m T,[0m
|
|
||||||
[38;2;248;248;242m U,[0m
|
|
||||||
[38;2;248;248;242m V,[0m
|
|
||||||
[38;2;248;248;242m W,[0m
|
|
||||||
[38;2;248;248;242m X,[0m
|
|
||||||
[38;2;248;248;242m Y,[0m
|
|
||||||
[38;2;248;248;242m Z,[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m `1` and `!`.[0m
|
|
||||||
[38;2;248;248;242m Kb1,[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m `2` and `@`.[0m
|
|
||||||
[38;2;248;248;242m Kb2,[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m `3` and `#`.[0m
|
|
||||||
[38;2;248;248;242m Kb3, [0m[38;2;117;113;94m--[0m[38;2;117;113;94m 0x20[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m / `4` and `$`.[0m
|
|
||||||
[38;2;248;248;242m Kb4,[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m `5` and `%`.[0m
|
|
||||||
[38;2;248;248;242m Kb5,[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m `6` and `^`.[0m
|
|
||||||
[38;2;248;248;242m Kb6,[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m `7` and `&`.[0m
|
|
||||||
[38;2;248;248;242m Kb7,[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m `8` and `*`.[0m
|
|
||||||
[38;2;248;248;242m Kb8,[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m `9` and `(`.[0m
|
|
||||||
[38;2;248;248;242m Kb9,[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m `0` and `)`.[0m
|
|
||||||
[38;2;248;248;242m Kb0,[0m
|
|
||||||
[38;2;248;248;242m Enter,[0m
|
|
||||||
[38;2;248;248;242m Escape,[0m
|
|
||||||
[38;2;248;248;242m BSpace,[0m
|
|
||||||
[38;2;248;248;242m Tab,[0m
|
|
||||||
[38;2;248;248;242m Space,[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m `-` and `_`.[0m
|
|
||||||
[38;2;248;248;242m Minus,[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m `=` and `+`.[0m
|
|
||||||
[38;2;248;248;242m Equal,[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m `[` and `{`.[0m
|
|
||||||
[38;2;248;248;242m LBracket,[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m `]` and `}`.[0m
|
|
||||||
[38;2;248;248;242m RBracket, [0m[38;2;117;113;94m--[0m[38;2;117;113;94m 0x30[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m / `\` and `|`.[0m
|
|
||||||
[38;2;248;248;242m Bslash,[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m Non-US `#` and `~` (Typically near the Enter key).[0m
|
|
||||||
[38;2;248;248;242m NonUsHash,[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m `;` and `:`.[0m
|
|
||||||
[38;2;248;248;242m SColon,[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m `'` and `"`.[0m
|
|
||||||
[38;2;248;248;242m Quote,[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m How to have ` as code?[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m \` and `~`.[0m
|
|
||||||
[38;2;248;248;242m Grave,[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m `,` and `<`.[0m
|
|
||||||
[38;2;248;248;242m Comma,[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m `.` and `>`.[0m
|
|
||||||
[38;2;248;248;242m Dot,[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m `/` and `?`.[0m
|
|
||||||
[38;2;248;248;242m Slash,[0m
|
|
||||||
[38;2;248;248;242m CapsLock,[0m
|
|
||||||
[38;2;248;248;242m F1,[0m
|
|
||||||
[38;2;248;248;242m F2,[0m
|
|
||||||
[38;2;248;248;242m F3,[0m
|
|
||||||
[38;2;248;248;242m F4,[0m
|
|
||||||
[38;2;248;248;242m F5,[0m
|
|
||||||
[38;2;248;248;242m F6,[0m
|
|
||||||
[38;2;248;248;242m F7, [0m[38;2;117;113;94m--[0m[38;2;117;113;94m 0x40[0m
|
|
||||||
[38;2;248;248;242m F8,[0m
|
|
||||||
[38;2;248;248;242m F9,[0m
|
|
||||||
[38;2;248;248;242m F10,[0m
|
|
||||||
[38;2;248;248;242m F11,[0m
|
|
||||||
[38;2;248;248;242m F12,[0m
|
|
||||||
[38;2;248;248;242m PScreen,[0m
|
|
||||||
[38;2;248;248;242m ScrollLock,[0m
|
|
||||||
[38;2;248;248;242m Pause,[0m
|
|
||||||
[38;2;248;248;242m Insert,[0m
|
|
||||||
[38;2;248;248;242m Home,[0m
|
|
||||||
[38;2;248;248;242m PgUp,[0m
|
|
||||||
[38;2;248;248;242m Delete,[0m
|
|
||||||
[38;2;248;248;242m Endd,[0m
|
|
||||||
[38;2;248;248;242m PgDown,[0m
|
|
||||||
[38;2;248;248;242m Right,[0m
|
|
||||||
[38;2;248;248;242m Left, [0m[38;2;117;113;94m--[0m[38;2;117;113;94m 0x50[0m
|
|
||||||
[38;2;248;248;242m Down,[0m
|
|
||||||
[38;2;248;248;242m Up,[0m
|
|
||||||
[38;2;248;248;242m NumLock,[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m Keypad `/`[0m
|
|
||||||
[38;2;248;248;242m KpSlash,[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m Keypad `*`[0m
|
|
||||||
[38;2;248;248;242m KpAsterisk,[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m Keypad `-`.[0m
|
|
||||||
[38;2;248;248;242m KpMinus,[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m Keypad `+`.[0m
|
|
||||||
[38;2;248;248;242m KpPlus,[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m Keypad enter.[0m
|
|
||||||
[38;2;248;248;242m KpEnter,[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m Keypad 1.[0m
|
|
||||||
[38;2;248;248;242m Kp1,[0m
|
|
||||||
[38;2;248;248;242m Kp2,[0m
|
|
||||||
[38;2;248;248;242m Kp3,[0m
|
|
||||||
[38;2;248;248;242m Kp4,[0m
|
|
||||||
[38;2;248;248;242m Kp5,[0m
|
|
||||||
[38;2;248;248;242m Kp6,[0m
|
|
||||||
[38;2;248;248;242m Kp7,[0m
|
|
||||||
[38;2;248;248;242m Kp8, [0m[38;2;117;113;94m--[0m[38;2;117;113;94m 0x60[0m
|
|
||||||
[38;2;248;248;242m Kp9,[0m
|
|
||||||
[38;2;248;248;242m Kp0,[0m
|
|
||||||
[38;2;248;248;242m KpDot,[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m Non-US `\` and `|` (Typically near the Left-Shift key)[0m
|
|
||||||
[38;2;248;248;242m NonUsBslash,[0m
|
|
||||||
[38;2;248;248;242m Application, [0m[38;2;117;113;94m--[0m[38;2;117;113;94m 0x65[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m / not a key, used for errors[0m
|
|
||||||
[38;2;248;248;242m Power,[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m Keypad `=`.[0m
|
|
||||||
[38;2;248;248;242m KpEqual,[0m
|
|
||||||
[38;2;248;248;242m F13,[0m
|
|
||||||
[38;2;248;248;242m F14,[0m
|
|
||||||
[38;2;248;248;242m F15,[0m
|
|
||||||
[38;2;248;248;242m F16,[0m
|
|
||||||
[38;2;248;248;242m F17,[0m
|
|
||||||
[38;2;248;248;242m F18,[0m
|
|
||||||
[38;2;248;248;242m F19,[0m
|
|
||||||
[38;2;248;248;242m F20,[0m
|
|
||||||
[38;2;248;248;242m F21, [0m[38;2;117;113;94m--[0m[38;2;117;113;94m 0x70[0m
|
|
||||||
[38;2;248;248;242m F22,[0m
|
|
||||||
[38;2;248;248;242m F23,[0m
|
|
||||||
[38;2;248;248;242m F24,[0m
|
|
||||||
[38;2;248;248;242m Execute,[0m
|
|
||||||
[38;2;248;248;242m Help,[0m
|
|
||||||
[38;2;248;248;242m Menu,[0m
|
|
||||||
[38;2;248;248;242m Selectt,[0m
|
|
||||||
[38;2;248;248;242m Stop,[0m
|
|
||||||
[38;2;248;248;242m Again,[0m
|
|
||||||
[38;2;248;248;242m Undo,[0m
|
|
||||||
[38;2;248;248;242m Cut,[0m
|
|
||||||
[38;2;248;248;242m Copy,[0m
|
|
||||||
[38;2;248;248;242m Paste,[0m
|
|
||||||
[38;2;248;248;242m Find,[0m
|
|
||||||
[38;2;248;248;242m Mute,[0m
|
|
||||||
[38;2;248;248;242m VolUp, [0m[38;2;117;113;94m--[0m[38;2;117;113;94m 0x80[0m
|
|
||||||
[38;2;248;248;242m VolDown,[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m Deprecated.[0m
|
|
||||||
[38;2;248;248;242m LockingCapsLock,[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m Deprecated.[0m
|
|
||||||
[38;2;248;248;242m LockingNumLock,[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m Deprecated.[0m
|
|
||||||
[38;2;248;248;242m LockingScrollLock,[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m / Keypad `,`, also used for the[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m brazilian keypad period (.) key.[0m
|
|
||||||
[38;2;248;248;242m KpComma,[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m Used on AS/400 keyboard[0m
|
|
||||||
[38;2;248;248;242m KpEqualSign,[0m
|
|
||||||
[38;2;248;248;242m Intl1,[0m
|
|
||||||
[38;2;248;248;242m Intl2,[0m
|
|
||||||
[38;2;248;248;242m Intl3,[0m
|
|
||||||
[38;2;248;248;242m Intl4,[0m
|
|
||||||
[38;2;248;248;242m Intl5,[0m
|
|
||||||
[38;2;248;248;242m Intl6,[0m
|
|
||||||
[38;2;248;248;242m Intl7,[0m
|
|
||||||
[38;2;248;248;242m Intl8,[0m
|
|
||||||
[38;2;248;248;242m Intl9,[0m
|
|
||||||
[38;2;248;248;242m Lang1, [0m[38;2;117;113;94m--[0m[38;2;117;113;94m 0x90[0m
|
|
||||||
[38;2;248;248;242m Lang2,[0m
|
|
||||||
[38;2;248;248;242m Lang3,[0m
|
|
||||||
[38;2;248;248;242m Lang4,[0m
|
|
||||||
[38;2;248;248;242m Lang5,[0m
|
|
||||||
[38;2;248;248;242m Lang6,[0m
|
|
||||||
[38;2;248;248;242m Lang7,[0m
|
|
||||||
[38;2;248;248;242m Lang8,[0m
|
|
||||||
[38;2;248;248;242m Lang9,[0m
|
|
||||||
[38;2;248;248;242m AltErase,[0m
|
|
||||||
[38;2;248;248;242m SysReq,[0m
|
|
||||||
[38;2;248;248;242m Cancel,[0m
|
|
||||||
[38;2;248;248;242m Clear,[0m
|
|
||||||
[38;2;248;248;242m Prior,[0m
|
|
||||||
[38;2;248;248;242m Returnn,[0m
|
|
||||||
[38;2;248;248;242m Separator,[0m
|
|
||||||
[38;2;248;248;242m Outt, [0m[38;2;117;113;94m--[0m[38;2;117;113;94m 0xA0[0m
|
|
||||||
[38;2;248;248;242m Oper,[0m
|
|
||||||
[38;2;248;248;242m ClearAgain,[0m
|
|
||||||
[38;2;248;248;242m CrSel,[0m
|
|
||||||
[38;2;248;248;242m ExSel,[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m According to QMK, 0xA5-0xDF are not[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m usable on modern keyboards[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m Modifiers[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m Left Control.[0m
|
|
||||||
[38;2;248;248;242m LCtrl, [0m[38;2;117;113;94m--[0m[38;2;117;113;94m = 0xE0,[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m / Left Shift.[0m
|
|
||||||
[38;2;248;248;242m LShift,[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m Left Alt.[0m
|
|
||||||
[38;2;248;248;242m LAlt,[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m Left GUI (the Windows key).[0m
|
|
||||||
[38;2;248;248;242m LGui,[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m Right Control.[0m
|
|
||||||
[38;2;248;248;242m RCtrl,[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m Right Shift.[0m
|
|
||||||
[38;2;248;248;242m RShift,[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m Right Alt (or Alt Gr). [0m
|
|
||||||
[38;2;248;248;242m RAlt,[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m Right GUI (the Windows key).[0m
|
|
||||||
[38;2;248;248;242m RGui, [0m[38;2;117;113;94m--[0m[38;2;117;113;94m 0xE7[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m Unofficial[0m
|
|
||||||
[38;2;248;248;242m MediaPlayPause, [0m[38;2;117;113;94m--[0m[38;2;117;113;94m 0xE8,[0m
|
|
||||||
[38;2;248;248;242m MediaStopCD,[0m
|
|
||||||
[38;2;248;248;242m MediaPreviousSong,[0m
|
|
||||||
[38;2;248;248;242m MediaNextSong,[0m
|
|
||||||
[38;2;248;248;242m MediaEjectCD,[0m
|
|
||||||
[38;2;248;248;242m MediaVolUp,[0m
|
|
||||||
[38;2;248;248;242m MediaVolDown,[0m
|
|
||||||
[38;2;248;248;242m MediaMute,[0m
|
|
||||||
[38;2;248;248;242m MediaWWW, [0m[38;2;117;113;94m--[0m[38;2;117;113;94m 0xF0[0m
|
|
||||||
[38;2;248;248;242m MediaBack,[0m
|
|
||||||
[38;2;248;248;242m MediaForward,[0m
|
|
||||||
[38;2;248;248;242m MediaStop,[0m
|
|
||||||
[38;2;248;248;242m MediaFind,[0m
|
|
||||||
[38;2;248;248;242m MediaScrollUp,[0m
|
|
||||||
[38;2;248;248;242m MediaScrollDown,[0m
|
|
||||||
[38;2;248;248;242m MediaEdit,[0m
|
|
||||||
[38;2;248;248;242m MediaSleep,[0m
|
|
||||||
[38;2;248;248;242m MediaCoffee,[0m
|
|
||||||
[38;2;248;248;242m MediaRefresh,[0m
|
|
||||||
[38;2;248;248;242m MediaCalc [0m[38;2;117;113;94m--[0m[38;2;117;113;94m 0xFB[0m
|
|
||||||
[38;2;248;248;242m );[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mtype[0m[38;2;248;248;242m Action_Type [0m[38;2;249;38;114mis[0m[38;2;248;248;242m (Key, No_Op, Trans, Layer, Multiple_Actions);[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m Should be a discriminated type[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mtype[0m[38;2;248;248;242m Action [0m[38;2;249;38;114mis[0m[38;2;248;248;242m [0m[38;2;249;38;114mrecord[0m
|
|
||||||
[38;2;249;38;114m [0m[38;2;166;226;46mT[0m[38;2;249;38;114m :[0m[38;2;248;248;242m Action_Type; [0m[38;2;117;113;94m--[0m[38;2;117;113;94m hould be the discriminant[0m
|
|
||||||
[38;2;249;38;114m [0m[38;2;166;226;46mC[0m[38;2;249;38;114m :[0m[38;2;248;248;242m Key_Code_T;[0m
|
|
||||||
[38;2;249;38;114m [0m[38;2;166;226;46mL[0m[38;2;249;38;114m :[0m[38;2;248;248;242m Natural;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mend record[0m[38;2;248;248;242m;[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mfunction[0m[38;2;248;248;242m [0m[38;2;166;226;46mKw[0m[38;2;248;248;242m (Code : Key_Code_T) [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m Action;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mfunction[0m[38;2;248;248;242m [0m[38;2;166;226;46mLw[0m[38;2;248;248;242m (V : Natural) [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m Action;[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mtype[0m[38;2;248;248;242m Key_Modifiers [0m[38;2;249;38;114mis[0m[38;2;248;248;242m [0m[38;2;249;38;114marray[0m[38;2;248;248;242m (Natural [0m[38;2;249;38;114mrange[0m[38;2;248;248;242m <>) [0m[38;2;249;38;114mof[0m[38;2;248;248;242m USB.Device.HID.Keyboard.Modifiers;[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mtype[0m[38;2;248;248;242m Key_Codes_T [0m[38;2;249;38;114mis[0m[38;2;248;248;242m [0m[38;2;249;38;114marray[0m[38;2;248;248;242m (Natural [0m[38;2;249;38;114mrange[0m[38;2;248;248;242m <>) [0m[38;2;249;38;114mof[0m[38;2;248;248;242m Key_Code_T;[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114msubtype[0m[38;2;248;248;242m Ac [0m[38;2;249;38;114mis[0m[38;2;248;248;242m Action;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mtype[0m[38;2;248;248;242m Layout [0m[38;2;249;38;114mis[0m[38;2;248;248;242m [0m[38;2;249;38;114marray[0m[38;2;248;248;242m ([0m[38;2;190;132;255m0[0m[38;2;248;248;242m .. Num_Layers - [0m[38;2;190;132;255m1[0m[38;2;248;248;242m, RowR, ColR) [0m[38;2;249;38;114mof[0m[38;2;248;248;242m Action;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mprocedure[0m[38;2;248;248;242m [0m[38;2;166;226;46mRegister_Events[0m[38;2;248;248;242m (L : Layout; Es : Events);[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mprocedure[0m[38;2;248;248;242m [0m[38;2;166;226;46mTick[0m[38;2;248;248;242m (L : Layout);[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mfunction[0m[38;2;248;248;242m [0m[38;2;166;226;46mGet_Key_Codes[0m[38;2;248;248;242m [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m Key_Codes_T;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mfunction[0m[38;2;248;248;242m [0m[38;2;166;226;46mGet_Modifiers[0m[38;2;248;248;242m [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m Key_Modifiers;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mprocedure[0m[38;2;248;248;242m [0m[38;2;166;226;46mInit[0m[38;2;248;248;242m;[0m
|
|
||||||
[38;2;249;38;114mend[0m[38;2;248;248;242m [0m[38;2;166;226;46mClick[0m[38;2;248;248;242m;[0m
|
|
29
tests/syntax-tests/highlighted/Ada/click.gpr
vendored
29
tests/syntax-tests/highlighted/Ada/click.gpr
vendored
@@ -1,29 +0,0 @@
|
|||||||
[38;2;249;38;114mwith[0m[38;2;248;248;242m [0m[38;2;230;219;116m"[0m[38;2;230;219;116mconfig/click_config.gpr[0m[38;2;230;219;116m"[0m[38;2;248;248;242m;[0m
|
|
||||||
[38;2;248;248;242mproject Click [0m[38;2;249;38;114mis[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mfor[0m[38;2;248;248;242m Library_Name [0m[38;2;249;38;114muse[0m[38;2;248;248;242m [0m[38;2;230;219;116m"[0m[38;2;230;219;116mClick[0m[38;2;230;219;116m"[0m[38;2;248;248;242m;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mfor[0m[38;2;248;248;242m Library_Version [0m[38;2;249;38;114muse[0m[38;2;248;248;242m Project'Library_Name & [0m[38;2;230;219;116m"[0m[38;2;230;219;116m.so.[0m[38;2;230;219;116m"[0m[38;2;248;248;242m & Click_Config.Crate_Version;[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mfor[0m[38;2;248;248;242m Source_Dirs [0m[38;2;249;38;114muse[0m[38;2;248;248;242m ([0m[38;2;230;219;116m"[0m[38;2;230;219;116msrc/[0m[38;2;230;219;116m"[0m[38;2;248;248;242m, [0m[38;2;230;219;116m"[0m[38;2;230;219;116mconfig/[0m[38;2;230;219;116m"[0m[38;2;248;248;242m);[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mfor[0m[38;2;248;248;242m Object_Dir [0m[38;2;249;38;114muse[0m[38;2;248;248;242m [0m[38;2;230;219;116m"[0m[38;2;230;219;116mobj/[0m[38;2;230;219;116m"[0m[38;2;248;248;242m & Click_Config.Build_Profile;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mfor[0m[38;2;248;248;242m Create_Missing_Dirs [0m[38;2;249;38;114muse[0m[38;2;248;248;242m [0m[38;2;230;219;116m"[0m[38;2;230;219;116mTrue[0m[38;2;230;219;116m"[0m[38;2;248;248;242m;[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mfor[0m[38;2;248;248;242m Library_Dir [0m[38;2;249;38;114muse[0m[38;2;248;248;242m [0m[38;2;230;219;116m"[0m[38;2;230;219;116mlib[0m[38;2;230;219;116m"[0m[38;2;248;248;242m;[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mtype[0m[38;2;248;248;242m Library_Type_Type [0m[38;2;249;38;114mis[0m[38;2;248;248;242m ([0m[38;2;230;219;116m"[0m[38;2;230;219;116mrelocatable[0m[38;2;230;219;116m"[0m[38;2;248;248;242m, [0m[38;2;230;219;116m"[0m[38;2;230;219;116mstatic[0m[38;2;230;219;116m"[0m[38;2;248;248;242m, [0m[38;2;230;219;116m"[0m[38;2;230;219;116mstatic-pic[0m[38;2;230;219;116m"[0m[38;2;248;248;242m);[0m
|
|
||||||
[38;2;249;38;114m [0m[38;2;166;226;46mLibrary_Type[0m[38;2;249;38;114m :[0m[38;2;248;248;242m Library_Type_Type :=[0m
|
|
||||||
[38;2;248;248;242m external ([0m[38;2;230;219;116m"[0m[38;2;230;219;116mCLICK_LIBRARY_TYPE[0m[38;2;230;219;116m"[0m[38;2;248;248;242m, external ([0m[38;2;230;219;116m"[0m[38;2;230;219;116mLIBRARY_TYPE[0m[38;2;230;219;116m"[0m[38;2;248;248;242m, [0m[38;2;230;219;116m"[0m[38;2;230;219;116mstatic[0m[38;2;230;219;116m"[0m[38;2;248;248;242m));[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mfor[0m[38;2;248;248;242m Library_Kind [0m[38;2;249;38;114muse[0m[38;2;248;248;242m Library_Type;[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mpackage[0m[38;2;248;248;242m [0m[38;2;166;226;46mCompiler[0m[38;2;248;248;242m [0m[38;2;249;38;114mis[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mfor[0m[38;2;248;248;242m Default_Switches ([0m[38;2;230;219;116m"[0m[38;2;230;219;116mAda[0m[38;2;230;219;116m"[0m[38;2;248;248;242m) [0m[38;2;249;38;114muse[0m[38;2;248;248;242m Click_Config.Ada_Compiler_Switches & ([0m[38;2;230;219;116m"[0m[38;2;230;219;116m-gnatX[0m[38;2;230;219;116m"[0m[38;2;248;248;242m, [0m[38;2;230;219;116m"[0m[38;2;230;219;116m-gnat2022[0m[38;2;230;219;116m"[0m[38;2;248;248;242m);[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mend[0m[38;2;248;248;242m [0m[38;2;166;226;46mCompiler[0m[38;2;248;248;242m;[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mpackage[0m[38;2;248;248;242m [0m[38;2;166;226;46mBinder[0m[38;2;248;248;242m [0m[38;2;249;38;114mis[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mfor[0m[38;2;248;248;242m Switches ([0m[38;2;230;219;116m"[0m[38;2;230;219;116mAda[0m[38;2;230;219;116m"[0m[38;2;248;248;242m) [0m[38;2;249;38;114muse[0m[38;2;248;248;242m ([0m[38;2;230;219;116m"[0m[38;2;230;219;116m-Es[0m[38;2;230;219;116m"[0m[38;2;248;248;242m); [0m[38;2;117;113;94m--[0m[38;2;117;113;94m Symbolic traceback[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mend[0m[38;2;248;248;242m [0m[38;2;166;226;46mBinder[0m[38;2;248;248;242m;[0m
|
|
||||||
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mpackage[0m[38;2;248;248;242m [0m[38;2;166;226;46mInstall[0m[38;2;248;248;242m [0m[38;2;249;38;114mis[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mfor[0m[38;2;248;248;242m Artifacts ([0m[38;2;230;219;116m"[0m[38;2;230;219;116m.[0m[38;2;230;219;116m"[0m[38;2;248;248;242m) [0m[38;2;249;38;114muse[0m[38;2;248;248;242m ([0m[38;2;230;219;116m"[0m[38;2;230;219;116mshare[0m[38;2;230;219;116m"[0m[38;2;248;248;242m);[0m
|
|
||||||
[38;2;248;248;242m [0m[38;2;249;38;114mend[0m[38;2;248;248;242m [0m[38;2;166;226;46mInstall[0m[38;2;248;248;242m;[0m
|
|
||||||
|
|
||||||
[38;2;249;38;114mend[0m[38;2;248;248;242m [0m[38;2;166;226;46mClick[0m[38;2;248;248;242m;[0m
|
|
@@ -1,8 +0,0 @@
|
|||||||
[38;2;190;132;255m0[0m[38;2;248;248;242m [0m[38;2;190;132;255m2[0m[38;2;248;248;242m [0m[38;2;190;132;255m*[0m[38;2;248;248;242m [0m[38;2;190;132;255m*[0m[38;2;248;248;242m [0m[38;2;190;132;255m*[0m[38;2;248;248;242m [0m[38;2;255;255;255m/bin/sh[0m[38;2;255;255;255m backup.sh[0m
|
|
||||||
[38;2;190;132;255m*[0m[38;2;248;248;242m/[0m[38;2;190;132;255m10[0m[38;2;248;248;242m [0m[38;2;190;132;255m*[0m[38;2;248;248;242m [0m[38;2;190;132;255m*[0m[38;2;248;248;242m [0m[38;2;190;132;255m*[0m[38;2;248;248;242m [0m[38;2;190;132;255m*[0m[38;2;248;248;242m [0m[38;2;255;255;255m/home/maverick/check-disk-space[0m
|
|
||||||
[38;2;190;132;255m0[0m[38;2;248;248;242m [0m[38;2;190;132;255m5[0m[38;2;248;248;242m,[0m[38;2;190;132;255m17[0m[38;2;248;248;242m [0m[38;2;190;132;255m*[0m[38;2;248;248;242m [0m[38;2;190;132;255m*[0m[38;2;248;248;242m [0m[38;2;190;132;255m*[0m[38;2;248;248;242m [0m[38;2;255;255;255m/scripts/script.sh[0m
|
|
||||||
[38;2;190;132;255m0[0m[38;2;248;248;242m [0m[38;2;190;132;255m2[0m[38;2;248;248;242m [0m[38;2;190;132;255m*[0m[38;2;248;248;242m [0m[38;2;190;132;255m*[0m[38;2;248;248;242m [0m[38;2;102;217;239msun[0m[38;2;248;248;242m [0m[38;2;102;217;239m[[0m[38;2;255;255;255m [0m[38;2;255;255;255m$[0m[38;2;255;255;255m([0m[38;2;255;255;255mdate[0m[38;2;255;255;255m +[0m[38;2;255;255;255m%[0m[38;2;255;255;255md[0m[38;2;255;255;255m)[0m[38;2;255;255;255m [0m[3;38;2;253;151;31m-[0m[3;38;2;253;151;31mle[0m[38;2;255;255;255m 07 [0m[38;2;102;217;239m][0m[38;2;255;255;255m [0m[38;2;249;38;114m&&[0m[38;2;255;255;255m [0m[38;2;255;255;255m/script/script.sh[0m
|
|
||||||
[38;2;255;255;255m@[0m[38;2;190;132;255mdaily[0m[38;2;248;248;242m [0m[38;2;255;255;255m/scripts/script.sh[0m
|
|
||||||
[38;2;255;255;255m@[0m[38;2;190;132;255mreboot[0m[38;2;248;248;242m [0m[38;2;255;255;255m/scripts/script.sh[0m
|
|
||||||
|
|
||||||
[38;2;255;255;255mMAIL[0m[38;2;249;38;114m=[0m[38;2;230;219;116mbob[0m
|
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user