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 для более подробного ознакомления.