Co-authored-by: Evgeniy Andreev <gsomix@gmail.com>
28 KiB
Клон утилиты cat(1) с поддержкой выделения синтаксиса и Git
Ключевые возможности • Использование • Установка • Кастомизация • Цели и альтернативы • Перевод [中文][日本語][한국어][Русский]
Выделение синтаксиса
bat поддерживает выделение синтаксиса для огромного количества языков программирования и разметки:
Интеграция с Git
bat использует git чтобы показать изменения в коде
(смотрите на левый сайдбар):
Показать непечатаемые символы
Вы можете использовать -A / --show-all флаг чтобы показать символы, которые невозможно напечатать:
Автоматическое разделение текста
bat умеет траслировать вывод в less если он слишком большой, чтобы уместится на экране полностью
Объединение файлов
О... Вы также можете объединять файлы 😉. Когда
bat обнаруживает неинтерактивный терминал (например когда вы направляете вывод в файл или в процесс), bat будет работать как cat и откатится к выводу это файла как обычного текста (без поддержки синтаксиса)
Как использовать
Вывести единственный файл в терминале
> bat README.md
Отобразить сразу несколько файлов в терминале
> bat src/*.rs
Читаем из stdin и определяем синтаксис автоматически (внимание, это работает, читая заглавную строку файла, например #!/bin/sh )
> curl -s https://sh.rustup.rs | bat
Прочитать из stdin с явным указанием языка
> yaml2json .travis.yml | json_pp | bat -l json
Вывести и выделить неотображаемые символы
> bat -A /etc/hosts
Использование как замена cat
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
find … -exec bat {} +
Если вы используете fd, вы вполне можете использоваль флаг -X/--exec-batch чтобы сделать тоже самое:
fd … -X bat
ripgrep
С помощью batgrep, bat может быть использован для вывода результата запроса ripgrep
batgrep needle src/
tail -f
bat может быть использован вместе с tail -f чтобы просматривать файл вместе с выделением синтаксиса
tail -f /var/log/pacman.log | bat --paging=never -l log
Заметьте, что мы отключаем пэйджинг чтобы это заработало. Мы так-же указываем синтаксис (-l log), так как он не может быть определен в данном случае.
git
Вы можете использовать bat с git show чтобы просмотреть старую версию файла с выделением синтаксиса:
git show v0.6.0:src/main.rs | bat -l rs
Обратите внимание, что выделение синтаксиса не работает в git diff на данный момент. Если вам это нужно, посмотрите delta.
xclip
Количество строк и просмотр изменений в bat может сделать копирование содержания файла немного сложной. Чтобы предотвратить это, используйте флаг -p/--plain или просто перевести вывод в xclip:
bat main.cpp | xclip
bat обнаружит, что вывод будет переведен, и выведет обычный текст без выделения синтаксиса.
man
bat может быть использован в виде выделения цвета для man, для этого установите переменную окружения
MANPAGER:
export MANPAGER="sh -c 'col -bx | bat -l man -p'"
man 2 select
Возможно вам понадобится также установить MANROFFOPT="-c" если у вас есть проблемы с форматированием.
Если вы хотите сделать этой одной командой, вы можете использовать batman.
Обратите внимание, что синтаксис manpage разрабатывается в этом репозитории, и все еще находится в разработке.
prettier / shfmt / rustfmt
Prettybat это скрипт, который форматирует код и выводит его с помощью bat.
Установка
Ubuntu (с помощью apt)
... и другие дистрибутивы основанные на Debian.
bat есть в репозиториях Ubuntu и
Debian, и доступен начиная с Ubuntu Eoan 19.10. На Debian bat пока-что доступен только с нестабильной веткой "Sid"
Если ваша версия Ubuntu/Debian достаточно новая, вы можете установить bat так:
apt install bat
Если вы установили bat таким образом, то бинарный файл может быть установлен как batcat заместо bat (из-за конфликта имени с другим пакетом). Вы можете сделать симлинк или алиас bat -> batcat чтобы предотвратить проблемы которые могут произойти с другими дистрибутивами.
mkdir -p ~/.local/bin
ln -s /usr/bin/batcat ~/.local/bin/bat
Ubuntu (С помощью самого нового .deb пакета)
... и другие дистрибутивы Linux основанные на Debian
Если пакет еще не был предоставлен в вашем Ubuntu/Debian дистрибутиве или вы хотите самую последнюю версия bat, вы можете скачать самый последний deb пакет отсюда:
release page и установить так:
sudo dpkg -i bat_0.15.4_amd64.deb # измените архитектуру и версию
Alpine Linux
Вы можете установить bat из оффициальных источников:
apk add bat
Arch Linux
Вы можете установить bat из оффициального источника:
pacman -S bat
Fedora
Вы можете установить bat из оффициального репозитория Fedora Modular.
dnf install bat
Gentoo Linux
Вы можете установить bat из оффициальных источников:
emerge sys-apps/bat
Void Linux
Вы можете установить bat с помощью xbps-install:
xbps-install -S bat
FreeBSD
Вы можете установить bat с помощью pkg:
pkg install bat
или самому скомпилировать его:
cd /usr/ports/textproc/bat
make install
С помощью nix
Вы можете установить bat используя nix package manager:
nix-env -i bat
openSUSE
Вы можете установитьbat с помощью zypper:
zypper install bat
On macOS
Вы можете установитьbat с помощью Homebrew:
brew install bat
Или-же установить его с помощью MacPorts:
port install bat
Windows
Есть несколько способов установить bat. Как только вы установили его, посмотрите на секцию "Использование bat в Windows".
С помощью Chocolatey
Вы можете установить bat с помощью Chocolatey:
choco install bat
С помощью Scoop
Вы можете установить bat с помощью scoop:
scoop install bat
Для этого у вас должен быть установлен Visual C++ Redistributable.
Из заранее скомпилированных файлов:
Их вы можете скачать на странице релизов,
Для этого у вас должен быть установлен Visual C++ Redistributable.
С помощью Docker
Вы можете использовать Docker image чтобы запустить bat в контейнере:
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:
# Устанавливаем роль на устройстве
ansible-galaxy install aeimer.install_bat
---
# Playbook для установки bat
- host: all
roles:
- aeimer.install_bat
Этот способ должен сработать со следующими дистрибутивами:
- Debian/Ubuntu
- ARM (например Raspberry PI)
- Arch Linux
- Void Linux
- FreeBSD
- MacOS
С помощью бинарников
Перейдите на страницу релизов для
скомпилированных файлов bat для различных платформ. Бинарные файлы со статической связкой так-же доступны - выбирайте архив с musl в имени.
Из исходников
Если вы желаете установить bat из исходников, вам понадобится Rust 1.40 или выше. После этого, вы должны использовать cargo чтобы все скомпилировать:
cargo install --locked bat
Кастомизация
Темы для выделения текста
Используйте bat --list-themes чтобы вывести список всех доступных тем. Для выбора темы TwoDark, используйте bat с флагом
--theme=TwoDark или поставьте переменную окружения BAT_THEME равной TwoDark. Используйте export BAT_THEME="TwoDark" в стартап файле вашей оболочки, чтобы изменить ее навсегда. Или же, используйте конфиг файл bat.
Если вы хотите просто просмотреть темы, используйте следующую команду (для этого вам понадобится fzf):
bat --list-themes | fzf --preview="bat --theme={} --color=always /путь/к/файлу"
bat отлично смотрится на темном фоне. Однако, если ваш терминал использует светлую тему, такие темы как GitHub или OneHalfLight будут смотреться куда лучше!
Вы так-же можете использовать новую тему, для этого перейдите в раздел добавления тем.
Изменение внешнего вывода
Вы можете использовать флаг --style чтобы изменять внешний вид вывода в bat.
Например, вы можете использовать --style=numbers,changes, чтобы показать только количество строк и изменений в Git. Установите переменную окружения BAT_STYLE чтобы изменить это навсегда, или используйте конфиг файл bat.
Добавление новых синтаксисов
bat использует syntect для выделения синтаксиса. syntect может читать
файл .sublime-syntax
и темы. Чтобы добавить новый синтаксис, сделайте следующее:
Создайте каталог с синтаксисом:
mkdir -p "$(bat --config-dir)/syntaxes"
cd "$(bat --config-dir)/syntaxes"
# Разместите файлы '.sublime-syntax'
# в каталоге (или субкаталогах), например:
git clone https://github.com/tellnobody1/sublime-purescript-syntax
Теперь, используйте следующую команду, чтобы превратить эти файлы в бинарный кеш:
bat cache --build
Теперь, вы можете использовать bat --list-languages чтобы проверить, доступны ли новые языки.
Если когда-нибудь вы заходите вернуться к настройкам по-умолчанию, введите
bat cache --clear
Добавление новых тем
Это работает похожим образом, так-же как и добавление новых тем выделения синтаксиса
Во-первых, создайте каталог с новыми темами для синтаксиса:
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.
Чтобы передать какие-то аргументы в ваш пейджер, вы так-же можете их поставить в этих переменных:
export BAT_PAGER="less -RF"
Так-же вы можете использовать файл конфигурации 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, когда включен светлый.
alias cat="bat --theme=\$(defaults read -globalDomain AppleInterfaceStyle &> /dev/null && echo default || echo GitHub)"
Файл конфигурации
bat так-же может быть кастомизирован с помощью файла конфигурации. Его местоположение зависит от вашей ОС, чтобы посмотреть его путь, введите
bat --config-file
Так-же вы можете установить переменную окружения BAT_CONFIG_PATH чтобы изменить путь к файлу конфигурации.
export BAT_CONFIG_PATH="/path/to/bat.conf"
Файл конфигурации по-умолчанию может быть создан с помощью флага --generate-config-file.
bat --generate-config-file
Формат
Файл конфигурации - это всего лишь набор аргументов. Введите bat --help, чтобы просмотреть список всех возможных флагов и аргументов. Также вы можете закомментировать строку с помощью #.
Пример файла конфигурации:
# Устанавливает тему "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 с его сайта или через Chocolatey. Чтобы его использовать, скопируйте исполняемый файл в ваш PATH или используйте переменную окружения. Пакет из Chocolatey установит все автоматически.
Цвета
Windows 10 поддерживает цвета и вconhost.exe (Command Prompt) и в PowerShell начиная с версии Windows
[v1511](https://ru.wikipedia.org/wiki/Windows_10#Обновления и поддержка), так-же как и в bash. На ранних версиях Windows, вы можете использовать
Cmder, в котором есть ConEmu.
Внимание: Версия 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:
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, ...).
Смотрите эту статью для полного списка терминалов.
Удостовертесь, что переменная COLORTERM равнаtruecolor или
24bit. Иначе bat не сможет определить поддержку 24-битных цветов (и будет использовать 8-битные).
Текст и номера строк плохо видны
Используйте другую тему (смотрите bat --list-themes чтобы увидеть все темы). Темы OneHalfDark и
OneHalfLight имеют более яркие номера строк и тексты.
Кодировки файлов
bat поддерживает UTF-8 и UTF-16. Для другой кодировки, вам возможно будет нужно перекодировать их, так как кодировка может быть распознана не верно. Используйте iconv.
Пример: у вас есть PHP файл в кодировке Latin-1 (ISO-8859-1):
iconv -f ISO-8859-1 -t UTF-8 my-file.php | bat
Внимание: вам может понадобится флаг -l/--language если синтаксис не смог быть авто-определен bat.
Разработка
# Рекурсивно клонирует все модули
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
Разработчики
Цели и альтернативы
bat старается добится:
- Красивый, продвинутый синтаксис.
- Интеграция с Git
- Быть заменой
cat - Предлагать дружелюбный интерфейс и аргументы.
Есть очень много альтернатив bat. Смотрите этот документ для сравнения.
Лицензия
Copyright (c) 2018-2020 Разработчики bat.
bat распостраняется под лицензями MIT License и Apache License 2.0.
Смотрите LICENSE-APACHE и LICENSE-MIT для более подробного ознакомления.


