Repository: sharkdp/bat
Pull request #1044 (2020-06-01 11:36:54)

Russian translation

DuckerMan: Hi there! Nope, this is a draft

Patch:
diff --git a/.github/workflows/CICD.yml b/.github/workflows/CICD.yml
new file mode 100644
index 00000000..f336315c
--- /dev/null
+++ b/.github/workflows/CICD.yml
@@ -0,0 +1,294 @@
+name: CICD
+
+env:
+  PROJECT_NAME: bat
+  PROJECT_DESC: "A `cat` clone with wings"
+  PROJECT_AUTH: "sharkdp"
+  RUST_MIN_SRV: "1.40.0"
+
+on: [push, pull_request]
+
+jobs:
+  min_version:
+    name: MinSRV # Minimum supported rust version
+    runs-on: ubuntu-latest
+    steps:
+    - uses: actions/checkout@v1
+    - name: Install `rust` toolchain (v${{ env.RUST_MIN_SRV }})
+      uses: actions-rs/toolchain@v1
+      with:
+        toolchain: ${{ env.RUST_MIN_SRV }}
+        default: true
+        profile: minimal # minimal component installation (ie, no documentation)
+    - name: Test
+      uses: actions-rs/cargo@v1
+      with:
+        command: test
+
+  build:
+    name: Build
+    runs-on: ${{ matrix.job.os }}
+    strategy:
+      fail-fast: false
+      matrix:
+        job:
+          # { os, target, cargo-options, features, use-cross, toolchain }
+          - { os: ubuntu-latest  , target: arm-unknown-linux-gnueabihf , use-cross: use-cross }
+          - { os: ubuntu-18.04   , target: aarch64-unknown-linux-gnu   , use-cross: use-cross }
+          - { os: ubuntu-18.04   , target: i586-unknown-linux-gnu      , use-cross: use-cross }
+          - { os: ubuntu-18.04   , target: i586-unknown-linux-musl     , use-cross: use-cross }
+          - { os: ubuntu-18.04   , target: i686-unknown-linux-gnu      , use-cross: use-cross }
+          - { os: ubuntu-18.04   , target: i686-unknown-linux-musl     , use-cross: use-cross }
+          - { os: ubuntu-18.04   , target: x86_64-unknown-linux-gnu    , use-cross: use-cross }
+          - { os: ubuntu-18.04   , target: x86_64-unknown-linux-musl   , use-cross: use-cross }
+          - { os: ubuntu-16.04   , target: x86_64-unknown-linux-gnu    , use-cross: use-cross }
+          - { os: macos-latest   , target: x86_64-apple-darwin         }
+          # - { os: windows-latest , target: i686-pc-windows-gnu         }  ## disabled; linker errors (missing '_imp____acrt_iob_func')
+          - { os: windows-latest , target: i686-pc-windows-msvc        }
+          # - { os: windows-latest , target: x86_64-pc-windows-gnu       }  ## disabled; linker errors (missing '_imp____acrt_iob_func')
+          - { os: windows-latest , target: x86_64-pc-windows-msvc      }
+    steps:
+    - uses: actions/checkout@v1
+    - name: Install any prerequisites
+      shell: bash
+      run: |
+        case ${{ matrix.job.target }} in
+          arm-unknown-linux-gnueabihf) sudo apt-get -y update ; sudo apt-get -y install gcc-arm-linux-gnueabihf ;;
+          aarch64-unknown-linux-gnu) sudo apt-get -y update ; sudo apt-get -y install gcc-aarch64-linux-gnu ;;
+        esac
+    - name: Initialize workflow variables
+      id: vars
+      shell: bash
+      run: |
+        # toolchain
+        TOOLCHAIN="stable" ## default to "stable" toolchain
+        # * specify alternate TOOLCHAIN for *-pc-windows-gnu targets; gnu targets on Windows are broken for the standard *-pc-windows-msvc toolchain (refs: <https://github.com/rust-lang/rust/issues/47048>, <https://github.com/rust-lang/rust/issues/53454>, <https://github.com/rust-lang/cargo/issues/6754>)
+        case ${{ matrix.job.target }} in *-pc-windows-gnu) TOOLCHAIN="stable-${{ matrix.job.target }}" ;; esac;
+        # * use requested TOOLCHAIN if specified
+        if [ -n "${{ matrix.job.toolchain }}" ]; then TOOLCHAIN="${{ matrix.job.toolchain }}" ; fi
+        echo set-output name=TOOLCHAIN::${TOOLCHAIN}
+        echo ::set-output name=TOOLCHAIN::${TOOLCHAIN}
+        # staging directory
+        STAGING='_staging'
+        echo set-output name=STAGING::${STAGING}
+        echo ::set-output name=STAGING::${STAGING}
+        # determine EXE suffix
+        EXE_suffix="" ; case ${{ matrix.job.target }} in *-pc-windows-*) EXE_suffix=".exe" ;; esac;
+        echo set-output name=EXE_suffix::${EXE_suffix}
+        echo ::set-output name=EXE_suffix::${EXE_suffix}
+        # parse commit reference info
+        REF_NAME=${GITHUB_REF#refs/*/}
+        unset REF_BRANCH ; case ${GITHUB_REF} in refs/heads/*) REF_BRANCH=${GITHUB_REF#refs/heads/} ;; esac;
+        unset REF_TAG ; case ${GITHUB_REF} in refs/tags/*) REF_TAG=${GITHUB_REF#refs/tags/} ;; esac;
+        REF_SHAS=${GITHUB_SHA:0:8}
+        echo set-output name=REF_NAME::${REF_NAME}
+        echo set-output name=REF_BRANCH::${REF_BRANCH}
+        echo set-output name=REF_TAG::${REF_TAG}
+        echo set-output name=REF_SHAS::${REF_SHAS}
+        echo ::set-output name=REF_NAME::${REF_NAME}
+        echo ::set-output name=REF_BRANCH::${REF_BRANCH}
+        echo ::set-output name=REF_TAG::${REF_TAG}
+        echo ::set-output name=REF_SHAS::${REF_SHAS}
+        # parse target
+        unset TARGET_ARCH ; case ${{ matrix.job.target }} in arm-unknown-linux-gnueabihf) TARGET_ARCH=arm ;; i686-*) TARGET_ARCH=i686 ;; x86_64-*) TARGET_ARCH=x86_64 ;; esac;
+        echo set-output name=TARGET_ARCH::${TARGET_ARCH}
+        echo ::set-output name=TARGET_ARCH::${TARGET_ARCH}
+        unset TARGET_OS ; case ${{ matrix.job.target }} in *-linux-*) TARGET_OS=linux ;; *-apple-*) TARGET_OS=macos ;; *-windows-*) TARGET_OS=windows ;; esac;
+        echo set-output name=TARGET_OS::${TARGET_OS}
+        echo ::set-output name=TARGET_OS::${TARGET_OS}
+        # package name
+        PKG_suffix=".tar.gz" ; case ${{ matrix.job.target }} in *-pc-windows-*) PKG_suffix=".zip" ;; esac;
+        PKG_BASENAME=${PROJECT_NAME}-${REF_TAG:-$REF_SHAS}-${{ matrix.job.target }}
+        PKG_NAME=${PKG_BASENAME}${PKG_suffix}
+        echo set-output name=PKG_suffix::${PKG_suffix}
+        echo set-output name=PKG_BASENAME::${PKG_BASENAME}
+        echo set-output name=PKG_NAME::${PKG_NAME}
+        echo ::set-output name=PKG_suffix::${PKG_suffix}
+        echo ::set-output name=PKG_BASENAME::${PKG_BASENAME}
+        echo ::set-output name=PKG_NAME::${PKG_NAME}
+        # deployable tag? (ie, leading "vM" or "M"; M == version number)
+        unset DEPLOY ; if [[ $REF_TAG =~ ^[vV]?[0-9].* ]]; then DEPLOY='true' ; fi
+        echo set-output name=DEPLOY::${DEPLOY:-<empty>/false}
+        echo ::set-output name=DEPLOY::${DEPLOY}
+        # DPKG architecture?
+        unset DPKG_ARCH
+        case ${{ matrix.job.target }} in
+          aarch64-*-linux-*) DPKG_ARCH=arm64 ;;
+          arm-*-linux-*hf) DPKG_ARCH=armhf ;;
+          i686-*-linux-*) DPKG_ARCH=i686 ;;
+          x86_64-*-linux-*) DPKG_ARCH=amd64 ;;
+        esac;
+        echo set-output name=DPKG_ARCH::${DPKG_ARCH}
+        echo ::set-output name=DPKG_ARCH::${DPKG_ARCH}
+        # DPKG version?
+        unset DPKG_VERSION ; if [[ $REF_TAG =~ ^[vV]?[0-9].* ]]; then DPKG_VERSION=${REF_TAG/#[vV]/} ; fi
+        echo set-output name=DPKG_VERSION::${DPKG_VERSION}
+        echo ::set-output name=DPKG_VERSION::${DPKG_VERSION}
+        # DPKG base name/conflicts?
+        DPKG_BASENAME=${PROJECT_NAME}
+        DPKG_CONFLICTS=${PROJECT_NAME}-musl
+        case ${{ matrix.job.target }} in *-musl) DPKG_BASENAME=${PROJECT_NAME}-musl ; DPKG_CONFLICTS=${PROJECT_NAME} ;; esac;
+        echo set-output name=DPKG_BASENAME::${DPKG_BASENAME}
+        echo set-output name=DPKG_CONFLICTS::${DPKG_CONFLICTS}
+        echo ::set-output name=DPKG_BASENAME::${DPKG_BASENAME}
+        echo ::set-output name=DPKG_CONFLICTS::${DPKG_CONFLICTS}
+        # DPKG name
+        unset DPKG_NAME;
+        if [[ -n $DPKG_ARCH && -n $DPKG_VERSION ]]; then DPKG_NAME="${DPKG_BASENAME}_${DPKG_VERSION}_${DPKG_ARCH}.deb" ; fi
+        echo set-output name=DPKG_NAME::${DPKG_NAME}
+        echo ::set-output name=DPKG_NAME::${DPKG_NAME}
+        # target-specific options
+        # * CARGO_USE_CROSS (truthy)
+        CARGO_USE_CROSS='true' ; case '${{ matrix.job.use-cross }}' in ''|0|f|false|n|no) unset CARGO_USE_CROSS ;; esac;
+        echo set-output name=CARGO_USE_CROSS::${CARGO_USE_CROSS:-<empty>/false}
+        echo ::set-output name=CARGO_USE_CROSS::${CARGO_USE_CROSS}
+        # # * `arm` cannot be tested on ubuntu-* hosts (b/c testing is currently primarily done via comparison of target outputs with built-in outputs and the `arm` target is not executable on the host)
+        JOB_DO_TESTING="true"
+        case ${{ matrix.job.target }} in arm-*) unset JOB_DO_TESTING ;; esac;
+        echo set-output name=JOB_DO_TESTING::${JOB_DO_TESTING:-<empty>/false}
+        echo ::set-output name=JOB_DO_TESTING::${JOB_DO_TESTING}
+        # # * test only library unit tests and binary for arm-type targets
+        unset CARGO_TEST_OPTIONS
+        unset CARGO_TEST_OPTIONS ; case ${{ matrix.job.target }} in arm-* | aarch64-*) CARGO_TEST_OPTIONS="--lib --bin ${PROJECT_NAME}" ;; esac;
+        echo set-output name=CARGO_TEST_OPTIONS::${CARGO_TEST_OPTIONS}
+        echo ::set-output name=CARGO_TEST_OPTIONS::${CARGO_TEST_OPTIONS}
+        # * executable for `strip`?
+        STRIP="strip" ; case ${{ matrix.job.target }} in arm-unknown-linux-gnueabihf) STRIP="arm-linux-gnueabihf-strip" ;; aarch64-unknown-linux-gnu) STRIP="aarch64-linux-gnu-strip" ;; *-pc-windows-msvc) STRIP="" ;; esac;
+        echo set-output name=STRIP::${STRIP}
+        echo ::set-output name=STRIP::${STRIP}
+    - name: Create all needed build/work directories
+      shell: bash
+      run: |
+        mkdir -p '${{ steps.vars.outputs.STAGING }}'
+        mkdir -p '${{ steps.vars.outputs.STAGING }}/${{ steps.vars.outputs.PKG_BASENAME }}'
+        mkdir -p '${{ steps.vars.outputs.STAGING }}/dpkg'
+    - name: rust toolchain ~ install
+      uses: actions-rs/toolchain@v1
+      with:
+        toolchain: ${{ steps.vars.outputs.TOOLCHAIN }}
+        target: ${{ matrix.job.target }}
+        override: true
+        profile: minimal # minimal component installation (ie, no documentation)
+    - name: Info
+      shell: bash
+      run: |
+        gcc --version || true
+        rustup -V
+        rustup toolchain list
+        rustup default
+        cargo -V
+        rustc -V
+    - name: Build
+      uses: actions-rs/cargo@v1
+      with:
+        use-cross: ${{ steps.vars.outputs.CARGO_USE_CROSS }}
+        command: build
+        args: --release --target=${{ matrix.job.target }} ${{ matrix.job.cargo-options }}
+    - name: Test
+      uses: actions-rs/cargo@v1
+      with:
+        use-cross: ${{ steps.vars.outputs.CARGO_USE_CROSS }}
+        command: test
+        args: --target=${{ matrix.job.target }} ${{ steps.vars.outputs.CARGO_TEST_OPTIONS}} ${{ matrix.job.cargo-options }}
+    - name: Archive executable artifacts
+      uses: actions/upload-artifact@master
+      with:
+        name: ${{ env.PROJECT_NAME }}-${{ matrix.job.target }}
+        path: target/${{ matrix.job.target }}/release/${{ env.PROJECT_NAME }}${{ steps.vars.outputs.EXE_suffix }}
+    - name: Package
+      shell: bash
+      run: |
+        # binary
+        cp 'target/${{ matrix.job.target }}/release/${{ env.PROJECT_NAME }}${{ steps.vars.outputs.EXE_suffix }}' '${{ steps.vars.outputs.STAGING }}/${{ steps.vars.outputs.PKG_BASENAME }}/'
+        # `strip` binary (if needed)
+        if [ -n "${{ steps.vars.outputs.STRIP }}" ]; then "${{ steps.vars.outputs.STRIP }}" '${{ steps.vars.outputs.STAGING }}/${{ steps.vars.outputs.PKG_BASENAME }}/${{ env.PROJECT_NAME }}${{ steps.vars.outputs.EXE_suffix }}' ; fi
+        # README and LICENSE
+        # * spell-checker:ignore EADME ICENSE
+        (shopt -s nullglob; for f in [R]"EADME"{,.*}; do cp $f '${{ steps.vars.outputs.STAGING }}/${{ steps.vars.outputs.PKG_BASENAME }}/' ; done)
+        (shopt -s nullglob; for f in [L]"ICENSE"{-*,}{,.*}; do cp $f '${{ steps.vars.outputs.STAGING }}/${{ steps.vars.outputs.PKG_BASENAME }}/' ; done)
+        # base compressed package
+        pushd '${{ steps.vars.outputs.STAGING }}/' >/dev/null
+        case ${{ matrix.job.target }} in
+          *-pc-windows-*) 7z -y a '${{ steps.vars.outputs.PKG_NAME }}' '${{ steps.vars.outputs.PKG_BASENAME }}'/* | tail -2 ;;
+          *) tar czf '${{ steps.vars.outputs.PKG_NAME }}' '${{ steps.vars.outputs.PKG_BASENAME }}'/* ;;
+        esac;
+        popd >/dev/null
+        # dpkg
+        if [ -n "${{ steps.vars.outputs.DPKG_NAME }}" ]; then
+          DPKG_DIR="${{ steps.vars.outputs.STAGING }}/dpkg"
+          # binary
+          install -Dm755 'target/${{ matrix.job.target }}/release/${{ env.PROJECT_NAME }}${{ steps.vars.outputs.EXE_suffix }}' "${DPKG_DIR}/usr/bin/${{ env.PROJECT_NAME }}${{ steps.vars.outputs.EXE_suffix }}"
+          if [ -n "${{ steps.vars.outputs.STRIP }}" ]; then "${{ steps.vars.outputs.STRIP }}" "${DPKG_DIR}/usr/bin/${{ env.PROJECT_NAME }}${{ steps.vars.outputs.EXE_suffix }}" ; fi
+          # README and LICENSE
+          (shopt -s nullglob; for f in [R]"EADME"{,.*}; do install -Dm644 "$f" "${DPKG_DIR}/usr/share/doc/${{ env.PROJECT_NAME }}/$f" ; done)
+          (shopt -s nullglob; for f in [L]"ICENSE"{-*,}{,.*}; do install -Dm644 "$f" "${DPKG_DIR}/usr/share/doc/${{ env.PROJECT_NAME }}/$f" ; done)
+          # control file
+          mkdir -p "${DPKG_DIR}/DEBIAN"
+          printf "Package: ${{ steps.vars.outputs.DPKG_BASENAME }}\nVersion: ${{ steps.vars.outputs.DPKG_VERSION }}\nSection: utils\nPriority: optional\nMaintainer: ${{ env.PROJECT_AUTH }}\nArchitecture: ${{ steps.vars.outputs.DPKG_ARCH }}\nProvides: ${{ env.PROJECT_NAME }}\nConflicts: ${{ steps.vars.outputs.DPKG_CONFLICTS }}\nDescription: ${{ env.PROJECT_DESC }}\n" > "${DPKG_DIR}/DEBIAN/control"
+          # build dpkg
+          fakeroot dpkg-deb --build "${DPKG_DIR}" "${{ steps.vars.outputs.STAGING }}/${{ steps.vars.outputs.DPKG_NAME }}"
+        fi
+    - name: Publish
+      uses: softprops/action-gh-release@v1
+      if: steps.vars.outputs.DEPLOY
+      with:
+        files: |
+          ${{ steps.vars.outputs.STAGING }}/${{ steps.vars.outputs.PKG_NAME }}
+          ${{ steps.vars.outputs.STAGING }}/${{ steps.vars.outputs.DPKG_NAME }}
+      env:
+        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+
+  coverage:
+    name: Code Coverage
+    runs-on: ${{ matrix.job.os }}
+    strategy:
+      fail-fast: true
+      matrix:
+        # job: [ { os: ubuntu-latest }, { os: macos-latest }, { os: windows-latest } ]
+        job:
+          - { os: ubuntu-latest , toolchain: nightly-2020-04-29 }
+          - { os: macos-latest , toolchain: nightly-2020-04-29 }
+          - { os: windows-latest , toolchain: nightly-2020-04-29-x86_64-pc-windows-gnu }
+    steps:
+    - uses: actions/checkout@v1
+    - name: Initialize workflow variables
+      id: vars
+      shell: bash
+      run: |
+        # toolchain
+        TOOLCHAIN="nightly" ## default to "nightly" toolchain
+        # * use requested TOOLCHAIN if specified
+        if [ -n "${{ matrix.job.toolchain }}" ]; then TOOLCHAIN="${{ matrix.job.toolchain }}" ; fi
+        # * use requested TOOLCHAIN if specified
+        if [ -n "${{ matrix.job.toolchain }}" ]; then TOOLCHAIN="${{ matrix.job.toolchain }}" ; fi
+        echo set-output name=TOOLCHAIN::${TOOLCHAIN}
+        echo ::set-output name=TOOLCHAIN::${TOOLCHAIN}
+        # target-specific options
+        # * CODECOV_FLAGS
+        CODECOV_FLAGS=$( echo "${{ matrix.job.os }}" | sed 's/[^[:alnum:]]/_/g' )
+        echo set-output name=CODECOV_FLAGS::${CODECOV_FLAGS}
+        echo ::set-output name=CODECOV_FLAGS::${CODECOV_FLAGS}
+    - name: rust toolchain ~ install
+      uses: actions-rs/toolchain@v1
+      with:
+        toolchain: ${{ steps.vars.outputs.TOOLCHAIN }}
+        override: true
+        profile: minimal # minimal component installation (ie, no documentation)
+    - name: Test
+      uses: actions-rs/cargo@v1
+      with:
+        command: test
+        args: --no-fail-fast
+      env:
+        CARGO_INCREMENTAL: '0'
+        RUSTFLAGS: '-Zprofile -Ccodegen-units=1 -Cinline-threshold=0 -Clink-dead-code -Coverflow-checks=off -Zno-landing-pads'
+    - name: Generate coverage data
+      id: coverage
+      uses: actions-rs/grcov@v0.1
+    - name: Upload coverage results (to Codecov.io)
+      uses: codecov/codecov-action@v1
+      with:
+        file: ${{ steps.coverage.outputs.report }}
+        flags: ${{ steps.vars.outputs.CODECOV_FLAGS }}
+        name: codecov-umbrella
+        fail_ci_if_error: false
diff --git a/Cargo.toml b/Cargo.toml
index b53b11b7..949375bd 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -76,6 +76,7 @@ default-features = false
 [dev-dependencies]
 tempdir = "0.3"
 assert_cmd = "1.0.1"
+predicates = "1.0.4"
 
 [build-dependencies]
 clap = { version = "2.33", optional = true }
diff --git a/README.md b/README.md
index 4e541bd9..2683b837 100644
--- a/README.md
+++ b/README.md
@@ -13,7 +13,7 @@
   <a href="#installation">Installation</a> •
   <a href="#customization">Customization</a> •
   <a href="#project-goals-and-alternatives">Project goals, alternatives</a> •
-  Translation [<a href="https://github.com/chinanf-boy/bat-zh">中文</a>][<a href="doc/README-ja.md">日本語</a>][<a href="doc/README-ko.md">한국어</a>]
+  Translation [<a href="https://github.com/chinanf-boy/bat-zh">中文</a>][<a href="doc/README-ja.md">日本語</a>][<a href="doc/README-ko.md">한국어</a>][<a href="doc/README-ru.md">Русский</a>]
 </p>
 
 ### Syntax highlighting
@@ -62,7 +62,9 @@ Display multiple files at once
 > bat src/*.rs
 ```
 
-Read from stdin, determine the syntax automatically
+Read from stdin, determine the syntax automatically (note, highlighting will
+only work if the syntax can be determined from the first line of the file,
+usually through a shebang such as `#!/bin/sh`)
 
 ```bash
 > curl -s https://sh.rustup.rs | bat
@@ -183,7 +185,7 @@ apt install bat
 ```
 
 If you install `bat` this way, please note that the executable may be installed as `batcat` instead of `bat` (due to [a name
-clash with another package](https://github.com/sharkdp/bat/issues/982)). You can set up a `bat -> batcat` symlink or alias to prevent any issues that may come up because of this and to be consistent with other distrutions:
+clash with another package](https://github.com/sharkdp/bat/issues/982)). You can set up a `bat -> batcat` symlink or alias to prevent any issues that may come up because of this and to be consistent with other distributions:
 ``` bash
 mkdir -p ~/.local/bin
 ln -s /usr/bin/batcat ~/.local/bin/bat
diff --git a/doc/README-ru.md b/doc/README-ru.md
new file mode 100644
index 00000000..5f5c3c54
--- /dev/null
+++ b/doc/README-ru.md
@@ -0,0 +1,593 @@
+<p align="center">
+  <img src="doc/logo-header.svg" alt="bat - a cat clone with wings"><br>
+  <a href="https://travis-ci.org/sharkdp/bat"><img src="https://travis-ci.org/sharkdp/bat.svg?branch=master" alt="Build Status"></a>
+  <a href="https://ci.appveyor.com/project/sharkdp/bat"><img src="https://ci.appveyor.com/api/projects/status/cptsmtbiwbnr2vhf/branch/master?svg=true"></a>
+  <img src="https://img.shields.io/crates/l/bat.svg" alt="license">
+  <a href="https://crates.io/crates/bat"><img src="https://img.shields.io/crates/v/bat.svg?colorB=319e8c" alt="Version info"></a><br>
+  Клон утилиты <i>cat(1)</i> с поддержкой выделения синтаксиса и Git
+</p>
+
+<p align="center">
+  <a href="#выделение-синтаксиса">Ключевые возможности</a> •
+  <a href="#как-использовать">Использование</a> •
+  <a href="#установка">Установка</a> •
+  <a href="#кастомизация">Кастомизация</a> •
+  <a href="#цели-и-альтернативы">Цели и альтернативы </a> •
+  Перевод [<a href="https://github.com/chinanf-boy/bat-zh">中文</a>][<a href="doc/README-ja.md">日本語</a>][<a href="doc/README-ko.md">한국어</a>][<a href="doc/README-ru.md">Русский</a>]
+</p>
+
+### Выделение синтаксиса
+
+`bat` поддерживает выделение синтаксиса для огромного количества языков программирования и разметки:
+
+![Пример выделения синтаксиса](https://i.imgur.com/3FGy5tW.png)
+
+### Интеграция с Git
+`bat` использует `git` чтобы показать изменения в коде
+(смотрите на левый сайдбар):
+
+![Пример интеграции с Git](https://i.imgur.com/azUAzdx.png)
+
+### Показать символы, которые не возможно отобразить
+
+Вы можете использовать `-A` / `--show-all` флаг чтобы показать символы, которые невозможно напечатать:
+
+![Строка с неотображемыми символами](https://i.imgur.com/X0orYY9.png)
+
+### Автоматическое разделение текста
+
+`bat` умеет траслировать вывод в `less` если вывод слишком большой, чтобы уместится на экране целиком
+
+### Объединение файлов
+
+О..вы так же можете объединять файлы :wink:. Всегда когда
+`bat` обнаруживает неинтерактивный терминал (например когда вы направляете вывод в файл или процесс), `bat` будет работать как вставная замена `cat` и откатится к выводу это файла как обычного текста
+
+## Как использовать
+
+Вывести единственный файл в терминале
+
+```bash
+> bat README.md
+```
+
+Отобразить сразу несколько файлов в терминале
+
+```bash
+> bat src/*.rs
+```
+
+Читаем из stdin и определяем синтаксис автоматически (внимание, это работает, читая заглавную строку файла, например `#!/bin/sh` )
+
+```bash
+> curl -s https://sh.rustup.rs | bat
+```
+
+Читает из stdin и указываем что это за язык
+
+```bash
+> yaml2json .travis.yml | json_pp | bat -l json
+```
+
+Вывести и выделить неотображаемые символы
+```bash
+> bat -A /etc/hosts
+```
+
+Использование как замена `cat`
+
+```bash
+bat > note.md  # мгновенно создаем новый файл
+
+bat header.md content.md footer.md > document.md
+
+bat -n main.rs  # показываем только количество строк
+
+bat f - g  # выводит 'f' в stdin, а потом 'g'.
+```
+
+### Интеграция с другими утилитами
+
+#### `find` или `fd`
+
+Вы можете использовать флаг `-exec` в `find` чтобы посмотреть превью всех файлов в `bat`
+```bash
+find … -exec bat {} +
+```
+
+Если вы используете [`fd`](https://github.com/sharkdp/fd), вы вполне можете использоваль флаг  `-X`/`--exec-batch` чтобы сделать тоже самое:
+```bash
+fd … -X bat
+```
+
+#### `ripgrep`
+
+С помощью [`batgrep`](https://github.com/eth-p/bat-extras/blob/master/doc/batgrep.md), `bat` может быть использован для вывода результата запроса [`ripgrep`](https://github.com/BurntSushi/ripgrep)
+
+```bash
+batgrep needle src/
+```
+
+#### `tail -f`
+
+`bat` может быть использован с  `tail -f` чтобы просматривать файл вместе с выделением синтаксиса
+```bash
+tail -f /var/log/pacman.log | bat --paging=never -l log
+```
+Заметье, что мы отключаем пэйджинг чтобы это заработало. Мы так-же указываем синтаксис (`-l log`), так как он не может быть определен в данном случае.
+
+#### `git`
+
+Вы можете использовать `bat` с `git show` чтобы просмотреть старую версию файла с выделением синтаксиса:
+```bash
+git show v0.6.0:src/main.rs | bat -l rs
+```
+
+Обратите внимание, что выделение синтаксиса не работает в `git diff` на данный момент. Если вам это нужно, посмотрите [`delta`](https://github.com/dandavison/delta).
+
+#### `xclip`
+
+Количество строк и просмотр изменений в `bat` может сделать копирование содержания файла немного сложной. Чтобы предотвратить это, используйте флаг `-p`/`--plain` или просто перевести вывод в `xclip`:
+```bash
+bat main.cpp | xclip
+```
+`bat` обнаружит, что вывод будет переведен, и выведет обычный текст без выделения синтаксиса.
+
+#### `man`
+
+`bat` может быть использован в виде выделения цвета для  `man`, для этого установите переменную окружения
+`MANPAGER`:
+
+```bash
+export MANPAGER="sh -c 'col -bx | bat -l man -p'"
+man 2 select
+```
+
+Возможно вам понадобится также установить `MANROFFOPT="-c"` если у вас есть проблемы с форматированием.
+
+Если вы хотите сделать этой одной командной, вы можете использовать `batman`](https://github.com/eth-p/bat-extras/blob/master/doc/batman.md).
+
+Обратите внимание, что [синтаксис manpage](assets/syntaxes/02_Extra/Manpage.sublime-syntax) разрабатывается в этом репозитории, и все еще находится в разработке.
+
+#### `prettier` / `shfmt` / `rustfmt`
+
+[`Prettybat`](https://github.com/eth-p/bat-extras/blob/master/doc/prettybat.md) это скрипт, который форматирует код и выводит его с помощью `bat`.
+
+
+## Установка
+
+[![Packaging status](https://repology.org/badge/vertical-allrepos/bat.svg)](https://repology.org/project/bat/versions)
+
+### Ubuntu (с помощью `apt`)
+*... и другие дистрибутивы основанные на Debian.*
+
+`bat` есть в репозиториях [Ubuntu](https://packages.ubuntu.com/eoan/bat) и
+[Debian](https://packages.debian.org/sid/bat), и доступен начиная с Ubuntu Eoan 19.10. На Debian `bat` пока-что доступен только с нестабильной веткой "Sid"
+
+Если ваша версия Ubuntu/Debian достаточно новая, вы можете установить `bat` так:
+
+```bash
+apt install bat
+```
+
+Если вы установили `bat` таким образом, то бинарный файл может быть установлен как `batcat` заместо `bat` (из-за [имя конфлиует с другим пакетом](https://github.com/sharkdp/bat/issues/982)). Вы можете сделать симлинк или алиас `bat -> batcat` чтобы предотвратить проблемы которые могут произойти с другими дистрибутивами.
+
+``` bash
+mkdir -p ~/.local/bin
+ln -s /usr/bin/batcat ~/.local/bin/bat
+```
+
+### Ubuntu (С помощью самоно нового `.deb` пакета)
+*... и другие дистрибутивы Linux основанные на Debian*
+
+Если пакет еще не был предоставлен в вашем Ubuntu/Debian или вы хотите самую последнюю версия `bat`, вы можете скачать самый последний `deb` пакет отсюда:
+[release page](https://github.com/sharkdp/bat/releases) и установить так:
+
+```bash
+sudo dpkg -i bat_0.15.4_amd64.deb  # измените архитектуру и версию
+```
+
+### Alpine Linux
+
+Вы можете установить [`bat`](https://pkgs.alpinelinux.org/packages?name=bat) из оффициальных источников:
+
+```bash
+apk add bat
+```
+
+### Arch Linux
+
+Вы можете установить [`bat`](https://www.archlinux.org/packages/community/x86_64/bat/) из оффициального источника:
+
+```bash
+pacman -S bat
+```
+
+### Fedora
+
+Вы можете установить [`bat`](https://koji.fedoraproject.org/koji/packageinfo?packageID=27506) из оффициального репозитория [Fedora Modular](https://docs.fedoraproject.org/en-US/modularity/using-modules/).
+
+```bash
+dnf install bat
+```
+
+### Gentoo Linux
+
+Вы можете установить [`bat`](https://packages.gentoo.org/packages/sys-apps/bat) из оффициальных источников:
+
+```bash
+emerge sys-apps/bat
+```
+
+### Void Linux
+
+Вы можете установить `bat` с помощью xbps-install:
+```bash
+xbps-install -S bat
+```
+
+### FreeBSD
+
+Вы можете установить [`bat`](https://www.freshports.org/textproc/bat) с помощью pkg:
+
+```bash
+pkg install bat
+```
+
+или самому скомпилировать его:
+
+```bash
+cd /usr/ports/textproc/bat
+make install
+```
+
+### С помощью nix
+
+Вы можете установить `bat` используя [nix package manager](https://nixos.org/nix):
+
+```bash
+nix-env -i bat
+```
+
+### openSUSE
+
+Вы можете установить`bat` с помощью zypper:
+
+```bash
+zypper install bat
+```
+
+### On macOS
+
+Вы можете установить`bat` с помощью [Homebrew](http://braumeister.org/formula/bat):
+
+```bash
+brew install bat
+```
+
+Или-же установить его с помощью [MacPorts](https://ports.macports.org/port/bat/summary):
+
+```bash
+port install bat
+```
+
+### Windows
+
+Есть несколько способов установить `bat`. Как только вы установили его, посмотрите на секцию ["Using `bat` on Windows"](#using-bat-on-windows).
+
+#### С помощью Chocolatey
+
+Вы можете установить `bat` с помощью [Chocolatey](https://chocolatey.org/packages/Bat):
+```bash
+choco install bat
+```
+
+#### С помощью Scoop
+
+Вы можете установить `bat` с помощью [scoop](https://scoop.sh/):
+```bash
+scoop install bat
+```
+
+Для этого у вас должен быть установлен [Visual C++ Redistributable](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads).
+
+#### Из заранее скомпилированных файлов:
+
+Их вы можете скачать на [странице релизов](https://github.com/sharkdp/bat/releases),
+
+Для этого у вас должен быть установлен [Visual C++ Redistributable](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads).
+
+### С помощью Docker
+
+Вы можете использовать [Docker image](https://hub.docker.com/r/danlynn/bat/) чтобы запустить `bat` в контейнере:
+```bash
+docker pull danlynn/bat
+alias bat='docker run -it --rm -e BAT_THEME -e BAT_STYLE -e BAT_TABS -v "$(pwd):/myapp" danlynn/bat'
+```
+
+### С помощью Ansible
+
+Вы можете установить `bat` с [Ansible](https://www.ansible.com/):
+
+```bash
+# Устанавливаем роль на устройстве
+ansible-galaxy install aeimer.install_bat
+```
+
+```yaml
+---
+# Playbook для установки bat
+- host: all
+  roles:
+    - aeimer.install_bat
+```
+
+- [Ansible Galaxy](https://galaxy.ansible.com/aeimer/install_bat)
+- [GitHub](https://github.com/aeimer/ansible-install-bat)
+
+Этот способ должен сработать со следующими дистрибутивами:
+- Debian/Ubuntu
+- ARM (например Raspberry PI)
+- Arch Linux
+- Void Linux
+- FreeBSD
+- MacOS
+
+### С помощью бинарников
+
+Перейдите на [страницу релизов](https://github.com/sharkdp/bat/releases) для
+скомпилированных файлов `bat` для различных платформ. Бинарные файлы со статической связкой так-же доступны - выбирайте архив с `musl` в имени.
+
+### Из исходников
+
+Если вы желаете установить `bat` из исходников, вам понадобится Rust 1.40 или выше. Далее, вы должны использовать `cargo` чтобы все скомпилировать:
+
+```bash
+cargo install --locked bat
+```
+
+## Кастомизация
+
+### Темы для выделения текста
+
+Используйте `bat --list-themes` чтобы вывести список всех доступных тем. Для выбора темы `TwoDark`, используйте `bat` с флагом
+`--theme=TwoDark` или поставьте переменную окружения `BAT_THEME` равной `TwoDark`. Используйте `export BAT_THEME="TwoDark"` в стартап файле вашей оболочки, чтобы изменить ее навсегда. Или же, используйте [конфиг файл](https://github.com/sharkdp/bat#configuration-file) `bat`.
+
+Если вы хотите просто просмотреть темы, используйте следующую команду (вам понадобится [`fzf`](https://github.com/junegunn/fzf) для этого):
+```bash
+bat --list-themes | fzf --preview="bat --theme={} --color=always /путь/к/файлу"
+```
+
+`bat` отлично смотрится на темном фоне. Однако, если ваш терминал использует светлую тему, такие темы как `GitHub` или `OneHalfLight` будут смотрется куда лучше!
+Вы так-же можете использовать новую тему, для этого перейдите [в раздел добавления тем](https://github.com/sharkdp/bat#adding-new-themes).
+
+### Изменение внешнего вывода
+
+Вы можете использовать флаг `--style` чтобы изменять внешний вид вывода в `bat`.
+Например, вы можете использовать `--style=numbers,changes`, чтобы показать только количество строк и изменений в Git. Установите переменную окружения `BAT_STYLE` чтобы изменить это навсегда, или используйте [конфиг файл](https://github.com/sharkdp/bat#configuration-file) `bat`.
+
+### Добавление новых синтаксисов
+
+`bat` использует [`syntect`](https://github.com/trishume/syntect/) для выделения синтаксиса. `syntect` может читать
+[файл `.sublime-syntax`](https://www.sublimetext.com/docs/3/syntax.html)
+и темы. Чтобы добавить новый синтаксис, сделайте следующее:
+
+Создайте каталог с синтаксисом:
+
+```bash
+mkdir -p "$(bat --config-dir)/syntaxes"
+cd "$(bat --config-dir)/syntaxes"
+
+# Разместите файлы '.sublime-syntax'
+# в каталоге (или субкаталогах), например:
+git clone https://github.com/tellnobody1/sublime-purescript-syntax
+```
+
+Теперь, используйте следующую команду, чтобы превратить эти файлы в бинарный кеш:
+
+```bash
+bat cache --build
+```
+
+Наконец, используйте `bat --list-languages` чтобы проверить, доступны ли новые языки.
+
+Если когда-нибудь вы заходите вернутся к настройкам по умолчанию, введите
+
+```bash
+bat cache --clear
+```
+
+### Добавление новых тем
+
+Это работает похожим образом, так-же как и добавление новых тем выделения синтаксиса
+
+Во-первых, создайте каталог с новыми темами для синтаксиса:
+```bash
+mkdir -p "$(bat --config-dir)/themes"
+cd "$(bat --config-dir)/themes"
+
+# Загрузите тему в формате '.tmTheme':
+git clone https://github.com/greggb/sublime-snazzy
+
+# Обновите кеш
+bat cache --build
+```
+
+Теперь, используйте `bat --list-themes` чтобы проверить доступность новых тем.
+
+### Использование другого пейджера.
+
+`bat` использует пейджер, указанный в переменной окружения `PAGER`. Если она не задана, то используется `less`.
+Если вы желаете использовать другой пейджер, вы можете либо изменить переменную `PAGER`, либо `BAT_PAGER` чтобы перезаписать то, что указано в `PAGER`.
+
+Чтобы передать какие-то аргументы в ваш пейджер, вы так-же можете их поставить в этих переменных:
+
+```bash
+export BAT_PAGER="less -RF"
+```
+
+Так-же вы можете использовать [файл конфигурации](https://github.com/sharkdp/bat#configuration-file) `bat` для изменения. (флаг `--pager`).
+
+**Внимание**: По умолчанию, `less` является пейджером (без каких либо аргументов),
+`bat` задаст следующие флаги для пейджера:
+ `-R`/`--RAW-CONTROL-CHARS`,
+`-F`/`--quit-if-one-screen` и `-X`/`--no-init`. Последний флаг(`-X`) используется только для `less`, чья версия раньше 530.
+
+Флаг `-R` нужен чтобы корректно воспроизвести ANSI цвета. Второй флаг (`-F`) говорит 
+`less` чтобы тот сразу-же завершился, если размер вывода меньше чем вертикальный размер терминала.
+Это удобно для небольших файлов, т.к вам не надо каждый раз нажимать `q` чтобы выйти из пейджера. Третий флаг (`-X`) нужен чтобы исправить баг с `--quit-if-one-screen` в старых версиях `less`. К сожалению, это так-же блокирует возможность использования там колеса мышки.
+
+Если вы хотите все же его включить, вы можете добавить флаг `-R`. 
+Для `less` новее чем 530, оно должно работать из коробки.
+
+### Темная тема
+
+Если вы используете темный режим в macOS, возможно вы захотите чтобы `bat` использовал другую тему, основанную на теме вашей ОС. Следующий сниппет использует тему `default`, когда у вас включен темный режим, и тему `GitHub`, когда включен светлый.
+
+```bash
+alias cat="bat --theme=\$(defaults read -globalDomain AppleInterfaceStyle &> /dev/null && echo default || echo GitHub)"
+```
+
+## Файл конфигурации
+
+`bat` так-же может быть кастомизирован с помощью файла конфигурации. Его местоположение зависит от вашей ОС, чтобы посмотреть его путь, введите
+```
+bat --config-file
+```
+
+Так-же вы можете установить переменную окружения `BAT_CONFIG_PATH` чтобы изменить путь к файлу конфигурации.
+```bash
+export BAT_CONFIG_PATH="/path/to/bat.conf"
+```
+
+Файл конфигурации по-умолчанию может быть создан с помощью флага `--generate-config-file`.
+```bash
+bat --generate-config-file
+```
+
+### Формат
+
+Файл конфигурации - это всего лишь набор аргументов. Введите `bat --help` чтобы просмотреть список всех возможных флагов и аргументов. Так-же, вы можете заккоментировать строчку с помощью `#`.
+
+Пример файла конфигурации:
+```bash
+# Устанавливает тему "TwoDark"
+--theme="TwoDark"
+
+# Показывает количество строк, изменений в Git и заголовок файла
+--style="numbers,changes,header"
+
+# Использует наклонный текст (не все терминалы поддерживаеются)
+--italic-text=always
+
+# Использует синтаксис C++ для всех .ino файлов
+--map-syntax "*.ino:C++"
+
+# Использует синтаксик Git Ignore для всех файлов .ignore
+--map-syntax ".ignore:Git Ignore"
+```
+
+## Использование `bat` в Windows
+
+`bat` в основном работает полностью из коробки, но несколько возможностей нуждаются в настройке.
+
+### Пейджинг
+
+Windows поддерживает только очень простой пейджер `more`. Вы можете скачать установщик для `less` [с его сайта](http://www.greenwoodsoftware.com/less/download.html) или [через Chocolatey](https://chocolatey.org/packages/Less). Чтобы его использовать, скопируйте исполняемый файл в ваш `PATH` или [используйте переменную окружения](#using-a-different-pager). [Пакет из Chocolatey](#on-windows) установит все автоматически.
+
+### Цвета
+
+Windows 10 поддерживает цвета и в`conhost.exe` (Command Prompt) и в PowerShell начиная с версии Windows
+[v1511](https://ru.wikipedia.org/wiki/Windows_10#Обновления и поддержка), так-же как и в bash. На ранних версиях Windows, вы можете использовать 
+[Cmder](http://cmder.net/), в котором есть [ConEmu](https://conemu.github.io/).
+
+**Внимание:** Версия `less` в Git и MSYS2 воспроизводит цвета неккоректно. Если у вас нет других пейджеров, мы можете отключить испольщование пейджеров с помощью флага `--paging=never`
+или установить `BAT_PAGER` равным пустой строке.
+
+### Cygwin
+
+`bat` не поддерижвает нативно пути в стиле Unix (`/cygdrive/*`). Когда указан абсолютный путь cygwin, `bat` выдаст следующую ошибку: `The system cannot find the path specified. (os error 3)`
+
+Она может быть решена, добавлением следующей функции в `.bash_profile`:
+
+```bash
+bat() {
+    local index
+    local args=("$@")
+    for index in $(seq 0 ${#args[@]}) ; do
+        case "${args[index]}" in
+        -*) continue;;
+        *)  [ -e "${args[index]}" ] && args[index]="$(cygpath --windows "${args[index]}")";;
+        esac
+    done
+    command bat "${args[@]}"
+}
+```
+
+## Проблемы и их решение
+
+### Терминалы и цвета
+
+`bat` поддерживает терминалы *с* и *без* поддержки truecolor. Однако,цвета в выделении синтаксиса не оптимизированы к 8-ми битным цветам и рекоментуется использовать терминалы с поддержкой 24-ых битных цветов (`terminator`, `konsole`, `iTerm2`, ...).
+Смотрите [эту статью](https://gist.github.com/XVilka/8346728) для полного списка терминалов.
+
+Удостовертесь, что переменная `COLORTERM` равна`truecolor` или
+`24bit`. Иначе, `bat` не сможет определить поддержку 24 битных цветов(и будет использовать 8 битные).
+
+### Текст и номера строк плохо видны
+
+Используйте другую тему (смотрите `bat --list-themes` чтобы увидеть все тмы). Темы `OneHalfDark` и
+`OneHalfLight` имеют более яркие номера строк и тексты.
+
+### Кодировки файлов
+
+`bat` поддерживает UTF-8 и UTF-16. Для другой кодировки, вам возможно будет нужно перекодировать их, так как кодировка может быть распознана не верно. Используйте `iconv`.
+Пример: у вас есть PHP файл в кодировке Latin-1 (ISO-8859-1):
+``` bash
+iconv -f ISO-8859-1 -t UTF-8 my-file.php | bat
+```
+Внимание: вам может понадобится флаг `-l`/`--language` если синтаксис не смог быть авто-определен `bat`.
+
+## Разработка
+
+```bash
+# Рекурсивно клонирует все модули
+git clone --recursive https://github.com/sharkdp/bat
+
+# Компиляции в режиме разработки
+cd bat
+cargo build --bins
+
+# Запуск тестов
+cargo test
+
+# Установка (релизная версия)
+cargo install --locked
+
+#Компилирование исполняего файла bat с другим синтаксисом и темами
+bash assets/create.sh
+cargo install --locked --force
+```
+
+## Разработчики
+
+- [sharkdp](https://github.com/sharkdp)
+- [eth-p](https://github.com/eth-p)
+
+## Цели и альтернативы
+
+`bat` старается добится:
+
+- Красивый, продвинутый синтаксис.
+- Интеграция с Git
+- Быть заменой `cat`
+- Предлагать дружелюбный интерфейс и аргументы.
+
+Есть очень много альтернатив `bat`. Смотрите [этот документ](doc/alternatives.md) для сравнения.
+
+## Лицензия
+Copyright (c) 2018-2020 [Разработчики bat](https://github.com/sharkdp/bat).
+
+`bat` распостраняется под лицензями MIT License и Apache License 2.0.
+
+Смотрите [LICENSE-APACHE](LICENSE-APACHE) и [LICENSE-MIT](LICENSE-MIT) для более подробного ознакомления.
diff --git a/src/assets.rs b/src/assets.rs
index 073cf564..86c3fe0b 100644
--- a/src/assets.rs
+++ b/src/assets.rs
@@ -331,6 +331,7 @@ mod tests {
                 .clone()
         }
 
+        #[cfg(unix)]
         fn syntax_for_file_os(&self, file_name: &OsStr) -> String {
             self.syntax_for_file_with_content_os(file_name, "")
         }
diff --git a/src/bin/bat/main.rs b/src/bin/bat/main.rs
index 4847db9a..65129fa7 100644
--- a/src/bin/bat/main.rs
+++ b/src/bin/bat/main.rs
@@ -8,7 +8,7 @@ mod config;
 mod directories;
 mod input;
 
-use std::collections::HashSet;
+use std::collections::{HashMap, HashSet};
 use std::ffi::OsStr;
 use std::io;
 use std::io::{BufReader, Write};
@@ -22,9 +22,11 @@ use crate::{
     app::App,
     config::{config_file, generate_config_file},
 };
+
 use assets::{assets_from_cache_or_binary, cache_dir, clear_assets, config_dir};
 use clap::crate_version;
 use directories::PROJECT_DIRS;
+use globset::GlobMatcher;
 
 use bat::{
     assets::HighlightingAssets,
@@ -33,6 +35,7 @@ use bat::{
     error::*,
     input::Input,
     style::{StyleComponent, StyleComponents},
+    MappingTarget,
 };
 
 const THEME_PREVIEW_DATA: &[u8] = include_bytes!("../../../assets/theme_preview.rs");
@@ -59,15 +62,41 @@ fn run_cache_subcommand(matches: &clap::ArgMatches) -> Result<()> {
     Ok(())
 }
 
+fn get_syntax_mapping_to_paths<'a>(
+    mappings: &[(GlobMatcher, MappingTarget<'a>)],
+) -> HashMap<&'a str, Vec<String>> {
+    let mut map = HashMap::new();
+    for mapping in mappings {
+        match mapping {
+            (_, MappingTarget::MapToUnknown) => {}
+            (matcher, MappingTarget::MapTo(s)) => {
+                let globs = map.entry(*s).or_insert_with(Vec::new);
+                globs.push(matcher.glob().glob().into());
+            }
+        }
+    }
+    map
+}
+
 pub fn list_languages(config: &Config) -> Result<()> {
     let assets = assets_from_cache_or_binary()?;
     let mut languages = assets
         .syntaxes()
         .iter()
         .filter(|syntax| !syntax.hidden && !syntax.file_extensions.is_empty())
+        .cloned()
         .collect::<Vec<_>>();
     languages.sort_by_key(|lang| lang.name.to_uppercase());
 
+    let configured_languages = get_syntax_mapping_to_paths(config.syntax_mapping.mappings());
+
+    for lang in languages.iter_mut() {
+        if let Some(additional_paths) = configured_languages.get(lang.name.as_str()) {
+            lang.file_extensions
+                .extend(additional_paths.iter().cloned());
+        }
+    }
+
     let stdout = io::stdout();
     let mut stdout = stdout.lock();
 
diff --git a/src/syntax_mapping.rs b/src/syntax_mapping.rs
index 0559e17c..1c817edd 100644
--- a/src/syntax_mapping.rs
+++ b/src/syntax_mapping.rs
@@ -59,6 +59,10 @@ impl<'a> SyntaxMapping<'a> {
         Ok(())
     }
 
+    pub fn mappings(&self) -> &[(GlobMatcher, MappingTarget<'a>)] {
+        &self.mappings
+    }
+
     pub(crate) fn get_syntax_for(&self, path: impl AsRef<Path>) -> Option<MappingTarget<'a>> {
         let candidate = Candidate::new(path.as_ref());
         let canddidate_filename = path.as_ref().file_name().map(Candidate::new);


Test patch:
diff --git a/tests/.gitattributes b/tests/.gitattributes
index 2cab29b4..ed47e9f2 100644
--- a/tests/.gitattributes
+++ b/tests/.gitattributes
@@ -1,3 +1,11 @@
+# force LF EOLs for test fixtures
+examples/** text=auto eol=lf
+snapshots/** text=auto eol=lf
+
+# BAT/CMD files always need CRLF EOLs
+*.[Bb][Aa][Tt] text eol=crlf
+*.[Cc][Mm][Dd] text eol=crlf
+
 examples/* linguist-vendored
 snapshots/* linguist-vendored
 benchmarks/* linguist-vendored
diff --git a/tests/integration_tests.rs b/tests/integration_tests.rs
index cd6cde5b..c1fce864 100644
--- a/tests/integration_tests.rs
+++ b/tests/integration_tests.rs
@@ -1,4 +1,5 @@
 use assert_cmd::Command;
+use predicates::{prelude::predicate,str::PredicateStrExt};
 use std::path::Path;
 use std::str::from_utf8;
 
@@ -377,7 +378,7 @@ fn pager_basic() {
         .arg("test.txt")
         .assert()
         .success()
-        .stdout("pager-output\n");
+        .stdout(predicate::eq("pager-output\n").normalize());
 }
 
 #[test]
@@ -389,7 +390,7 @@ fn pager_overwrite() {
         .arg("test.txt")
         .assert()
         .success()
-        .stdout("pager-output\n");
+        .stdout(predicate::eq("pager-output\n").normalize());
 }
 
 #[test]
@@ -401,7 +402,7 @@ fn pager_disable() {
         .arg("test.txt")
         .assert()
         .success()
-        .stdout("hello world\n");
+        .stdout(predicate::eq("hello world\n").normalize());
 }
 
 #[test]
@@ -421,7 +422,7 @@ fn config_read_arguments_from_file() {
         .arg("test.txt")
         .assert()
         .success()
-        .stdout("dummy-pager-from-config\n");
+        .stdout(predicate::eq("dummy-pager-from-config\n").normalize());
 }
 
 #[test]