Мы тратим огромную часть своего времени на навигацию по файлам, строкам и командам. Именно здесь на помощь приходит Skim! Это мощный инструмент нечёткого поиска (fuzzy finder), призванный сделать вашу работу быстрее и эффективнее.
Жизнь коротка — skim!
Мы тратим огромную часть своего времени на навигацию по файлам, строкам и командам. Именно здесь на помощь приходит Skim! Это мощный инструмент нечёткого поиска, призванный сделать вашу работу быстрее и эффективнее.
Skim предоставляет единственный исполняемый файл — sk. Думайте о нём как об умной альтернативе инструментам вроде grep: стоит попробовать один раз, и вы уже не сможете представить, как обходились без него.
Установка
Проект Skim включает несколько компонентов:
-
Исполняемый файл
sk— основная программа. -
Плагин для Vim/Nvim — для вызова
skвнутри Vim/Nvim. Поддержка Vim описана в файле skim.vim.
Менеджеры пакетов
| ОС | Менеджер пакетов | Команда |
|---|---|---|
macOS |
Homebrew |
|
macOS |
MacPorts |
|
Alpine |
apk |
|
Arch |
pacman |
|
Fedora |
COPR |
см. ниже |
Gentoo |
Portage |
|
Guix |
guix |
|
Void |
XBPS |
|
Windows |
winget |
|
Windows |
Scoop |
|
Debian/Ubuntu |
apt |
см. ниже |
Fedora/RHEL |
dnf |
см. ниже |
Debian/Ubuntu
Специальный APT-репозиторий доступен и обновляется автоматически при каждом релизе:
-
Импортируйте ключ подписи
С помощью wget:
sudo mkdir -p /etc/apt/keyrings
sudo wget -O /etc/apt/keyrings/skim.asc https://skim-rs.github.io/skim/apt/skim-archive-keyring.asc
Или с помощью cURL:
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://skim-rs.github.io/skim/apt/skim-archive-keyring.asc | sudo tee /etc/apt/keyrings/skim.asc > /dev/null
-
Добавьте репозиторий
echo 'deb [signed-by=/etc/apt/keyrings/skim.asc] https://skim-rs.github.io/skim/apt ./' | sudo tee /etc/apt/sources.list.d/skim.list
sudo apt-get update
-
Установите пакет
sudo apt-get install skim
Кроме того, .deb-пакеты прикреплены непосредственно к каждому релизу. Скачайте пакет, соответствующий вашей архитектуре, и выполните sudo dpkg -i skim_*_amd64.deb.
Fedora/RHEL
Актуальные пакеты для Fedora/RHEL доступны через неофициальный COPR-репозиторий, поддерживаемый сообществом.
sudo dnf copr enable sisyphus1813/skim
sudo dnf install skim
Кроме того, .rpm-пакеты прикреплены непосредственно к каждому релизу. Скачайте пакет и выполните sudo rpm -i skim-*.x86_64.rpm.
Установка вручную
Можно воспользоваться любым из следующих способов:
-
С помощью скрипта установки:
# Всегда проверяйте содержимое скрипта перед запуском! $ curl --proto '=https' --tlsv1.2 -LsSf https://github.com/skim-rs/skim/releases/latest/download/skim-installer.sh | sh -
Используя бинарный файл: просто скачайте исполняемый файл sk напрямую.
-
Установка с crates.io:
cargo install skim -
Сборка вручную:
$ git clone --depth 1 git@github.com:skim-rs/skim.git ~/.skim $ cd ~/.skim $ cargo build --release $ # Добавьте полученный файл `target/release/sk` в переменную PATH
После установки вам будут доступны:
-
Страница руководства (man page) — её можно либо скопировать в нужную директорию, либо открыть командой
man --local-file <(sk --man). -
Скрипты автодополнения для командной оболочки (shell completions) и, опционально, привязки клавиш — через
source <(sk --shell \<shell> \[--shell-bindings]). Подробности — ниже.
Использование
Skim можно использовать как универсальный фильтр (по аналогии с grep) или как интерактивный интерфейс для выполнения команд.
Как плагин Vim (в Neovim рекомендуется использовать fzf-lua с профилем skim)
Через vim-plug (рекомендуется):
Установите skim, затем добавьте в конфигурацию:
Plug 'skim-rs/skim'
Как фильтр
Несколько примеров для быстрого старта:
# Прямой вызов skim
sk
# Или передача данных через пайп (нажмите TAB для выбора нескольких элементов при включённом флаге -m)
vim $(find . -name "*.rs" | sk -m)
Последняя команда позволяет выбрать файлы с расширением .rs и открыть их в Vim — отличная экономия времени для разработчиков!
Как интерактивный интерфейс
skim умеет динамически вызывать другие команды. Как правило, его интегрируют с grep, ack, ag или rg для поиска по содержимому файлов в каталоге проекта:
# работает с grep
sk --ansi -i -c 'grep -rI --color=always --line-number {q} .'
# работает с ack
sk --ansi -i -c 'ack --color {q}'
# работает с ag
sk --ansi -i -c 'ag --color {q}'
# работает с rg
sk --ansi -i -c 'rg --color=always --line-number {q}'
|
Примечание
|
В этих примерах {q} буквально подставляется в виде текущего запроса (в одинарных кавычках). Иными словами, поиск идёт по точному совпадению со строкой запроса, а не нечёткий. Для нечёткого поиска передайте вывод команды в sk через пайп, не используя интерактивный режим.
|
Привязки клавиш командной оболочки (Shell Bindings)
Привязки для Fish, Bash и Zsh находятся в каталоге shell:
-
completion.{shell}— скрипты автодополнения для использованияskв командной строке; -
key-bindings.{shell}— привязки клавиш и интеграции с оболочкой:-
ctrl-t— выбрать файл черезsk; -
ctrl-r— выбрать запись из истории черезsk; -
alt-c— перейти в каталог, выбранный черезsk; -
(недоступно в
fish)— дополнение путей к файлам: например,ls <tab>откроет виджетskдля выбора папки.
-
Чтобы активировать эти функции, подключите файл key-bindings.{shell} с помощью source и настройте автодополнение согласно документации вашей оболочки или следуйте инструкциям ниже.
Автодополнение для командной оболочки
Сгенерировать автодополнение для нужной оболочки можно с помощью флага --shell. Поддерживаются: bash, zsh, fish, powershell и elvish.
Вариант 1: подключение напрямую в текущем сеансе оболочки
# Для bash
source <(sk --shell bash)
# Для zsh
source <(sk --shell zsh)
# Для fish
sk --shell fish | source
Вариант 2: сохранение в файл для автозагрузки при старте оболочки
# Для bash — добавьте в ~/.bashrc
echo 'source <(sk --shell bash)' >> ~/.bashrc # Или сохраните в ~/.bash_completion
# Для zsh — добавьте в ~/.zshrc
sk --shell zsh > ~/.zfunc/_sk # Создайте каталог ~/.zfunc и добавьте его в fpath в ~/.zshrc
# Для fish — добавьте в ~/.config/fish/completions/
sk --shell fish > ~/.config/fish/completions/sk.fish
Привязки клавиш
Наиболее часто используемые привязки клавиш:
| Клавиша | Действие |
|---|---|
Enter |
Подтвердить (выбрать текущий элемент и выйти) |
ESC / Ctrl-G |
Отменить |
Ctrl-P / Стрелка вверх |
Переместить курсор вверх |
Ctrl-N / Стрелка вниз |
Переместить курсор вниз |
TAB |
Переключить выделение и перейти вниз (при флаге |
Shift-TAB |
Переключить выделение и перейти вверх (при флаге |
Полный список привязок клавиш приведён в странице руководства (man sk).
Синтаксис поиска
skim использует синтаксис fzf для сопоставления элементов:
| Токен | Тип совпадения | Описание |
|---|---|---|
|
нечёткое совпадение |
элементы, совпадающие с |
|
точное совпадение с началом строки |
элементы, начинающиеся с |
|
точное совпадение с концом строки |
элементы, заканчивающиеся на |
|
точное совпадение (в кавычках) |
элементы, содержащие |
|
инверсное точное совпадение |
элементы, не содержащие |
|
инверсное совпадение с концом строки |
элементы, не заканчивающиеся на |
skim также поддерживает комбинации токенов.
-
Пробел означает
AND. Например, по запросуsrc mainбудут найдены элементы, содержащие оба слова:srcиmain. -
` | ` означает
OR(обратите внимание на пробелы вокруг|). Например, по запросу.md$ | .markdown$будут найдены элементы, заканчивающиеся на.mdили.markdown. -
ORимеет более высокий приоритет. Например,readme .md$ | .markdown$интерпретируется какreadme AND (.md$ OR .markdown$). -
При использовании опции
--split-matchкаждая часть, разделённая пробелами или|, сопоставляется раздельно:-
Если разделитель (по умолчанию
:) отсутствует в запросе, выполняется обычное совпадение. -
Если разделитель присутствует, часть до него сопоставляется с частью до разделителя в элементах, а часть после него (включая возможные последующие вхождения разделителя) — с частью после разделителя. Это особенно удобно при передаче данных из
rgдля одновременного поиска по имени файла и содержимому.
-
Если вы предпочитаете регулярные выражения, skim поддерживает режим regex:
sk --regex
Переключиться в режим regex во время работы можно нажатием Ctrl-R (переключение режима).
Коды завершения
| Код | Значение |
|---|---|
0 |
Нормальное завершение |
1 |
Совпадений не найдено |
130 |
Прервано нажатием Ctrl-C / Ctrl-G / ESC и т. д. |
Совместимые инструменты
Следующие инструменты совместимы с skim или стремятся к этому:
Плагин fzf-lua для Neovim
Плагин для Neovim, позволяющий использовать fzf и skim для навигации по коду.
Установите его через свой менеджер плагинов, следуя README. Например, с lazy.nvim:
{
"ibhagwan/fzf-lua",
-- включить поддержку `sk` вместо `fzf` по умолчанию
opts = {'skim'}
}
nu_plugin_skim
Плагин для nushell, обеспечивающий более тесную интеграцию между skim и nushell.
Следуя инструкциям из README плагина, установите его с помощью cargo:
cargo install nu_plugin_skim
plugin add ~/.cargo/bin/nu_plugin_skim
Расширение для SQLite
Загружаемый модуль sqlite, добавляющий функцию skim_score в SQL-запросы.
Настройка
Документация здесь носит ознакомительный характер; полный список опций приведён на странице руководства (man sk).
Keymap (привязки клавиш)
Привязки задаются через разделённые запятыми пары (без пробелов). Например:
sk --bind 'alt-a:select-all,alt-d:deselect-all'
Также можно объединять действия с помощью +, например: execute-silent(echo {} | pbcopy)+abort.
Подробности — в разделе KEY BINDINGS страницы руководства.
Критерии сортировки
Для сортировки результатов доступны пять ключей: score, index, begin, end, length. Порядок сортировки задаётся командой sk --tiebreak score,index,-begin или в любой другой нужной вам комбинации.
Цветовая схема
У каждого свои эстетические предпочтения! К счастью, внешний вид Skim не ограничен значениями по умолчанию — инструмент поддерживает детальную настройку цветовой схемы.
--color=[BASE_SCHEME][,COLOR:ANSI]
Skim также учитывает переменную окружения NO_COLOR. Установите её в любое значение, и sk (как и многие другие терминальные приложения) отключит весь цветной вывод. Подробнее — на no-color.org.
Встроенные базовые цветовые схемы
Skim поставляется с несколькими встроенными схемами, которые можно взять за основу:
sk --color=dark # Тёмная тема по умолчанию (256 цветов)
sk --color=light # Светлая тема (256 цветов)
sk --color=16 # Простая тема с 16 цветами
sk --color=bw # Минималистичная чёрно-белая тема (без цветов, только стили)
sk --color=none # Минималистичная чёрно-белая тема (без цветов и стилей)
sk --color=molokai # Тема в стиле Molokai (256 цветов)
Настройка отдельных цветов
Цвета отдельных элементов интерфейса задаются после базовой схемы:
sk --color=light,fg:232,bg:255,current_bg:116,info:27
Цвет можно указать несколькими способами:
-
Цвета ANSI (0–255):
sk --color=fg:232,bg:255 -
RGB в шестнадцатеричном формате:
sk --color=fg:#FF0000(красный текст)
Доступные элементы для настройки цветов
| Элемент | Описание | Пример |
|---|---|---|
|
Цвет обычного текста |
|
|
Цвет фона обычного текста |
|
|
Совпавший текст в результатах поиска |
|
|
Фон совпавшего текста |
|
|
Цвет текста текущей строки |
|
|
Цвет фона текущей строки |
|
|
Совпавший текст в текущей строке |
|
|
Фон совпавшего текста в текущей строке |
|
|
Цвет индикатора прогресса |
|
|
Цвет информационной строки |
|
|
Цвет строки приглашения |
|
|
Цвет курсора |
|
|
Цвет маркера выбранного элемента |
|
|
Цвет заголовка |
|
|
Цвет рамки области предпросмотра / раскладки |
|
|
Цвет ползунка полосы прокрутки списка |
|
Примеры
# Светлая тема с изменённым фоном текущей строки
sk --color=light,current_bg:24
# Пользовательская тема с несколькими цветами
sk --color=dark,matched:#00FF00,current:#FFFFFF,current_bg:#000080
# Высококонтрастная тема
sk --color=fg:232,bg:255,matched:160,current:255,current_bg:20
Подробности — на странице руководства (man sk).
Прочее
-
--ansi: разбирать ANSI-коды цветов (например,\e[32mABC) во входных данных; -
--regex: использовать запрос как регулярное выражение для поиска по источнику данных.
Продвинутые темы
Интерактивный режим
В интерактивном режиме (interactive mode) команды вызываются динамически. Попробуйте:
sk --ansi -i -c 'rg --color=always --line-number {q}'
Как это работает?
-
Skim принимает данные двух видов: вывод команды или данные из пайпа.
-
Skim имеет два вида строк ввода: строка запроса для указания шаблона поиска и командная строка для указания «аргументов» команды.
-
-cзадаёт выполняемую команду; по умолчанию используетсяSKIM_DEFAULT_COMMAND. -
-iуказывает skim открыть командную строку при запуске — по умолчанию отображаетсяc>.
Чтобы дополнительно сузить результаты, возвращаемые командой, нажмите Ctrl-Q для переключения интерактивного режима.
Выполнение внешних программ
Можно настроить привязки клавиш для запуска внешних процессов, не покидая Skim (execute, execute-silent).
# Нажмите F1, чтобы открыть файл в less, не выходя из skim
# Нажмите CTRL-Y, чтобы скопировать строку в буфер обмена и выйти из skim (требует pbcopy)
sk --bind 'f1:execute(less -f {}),ctrl-y:execute-silent(echo {} | pbcopy)+abort'
Алгоритмы
Skim поддерживает несколько алгоритмов поиска — полный список доступен в справке или на странице руководства. Среди них:
-
skim_v2— алгоритм по умолчанию, в основе которого лежит алгоритмfzf; -
frizbee— использует frizbee, устойчивый к опечаткам алгоритм из плагина blink.cmp для Neovim; -
fzy— основан на алгоритме fzy с базовой устойчивостью к опечаткам; -
arinae— новейший алгоритм Skim, разработанный собственной командой с упором на устойчивость к опечаткам; развивает все предыдущие подходы, делая нечёткое совпадение более естественным при высокой производительности на каждый элемент.
Окно предпросмотра
Это замечательная возможность fzf, которую Skim позаимствовал. Например: мы используем ag для поиска совпадающих строк, а когда сузили список до нужных строк, хотим окончательно решить, какие из них выбрать, увидев контекст вокруг каждой. У grep и ag есть опция --context, и Skim умеет ею пользоваться для улучшенного окна предпросмотра:
sk --ansi -i -c 'ag --color {q}' --preview "preview.sh {}"
(Заметьте, что preview.sh — это скрипт, выводящий контекст по имени файла в формате имя_файла:строка:столбец.)
В результате вы увидите нечто подобное:
Как это работает?
Если команда предпросмотра задана через опцию --preview, Skim подставляет {} на место текущей выделенной строки (заключённой в одинарные кавычки), выполняет команду и выводит её результат в окно предпросмотра.
Иногда для вызова команды не нужна вся строка целиком. В таких случаях можно использовать {}, {1..}, {..3} или {1..5} для выбора нужных полей. Синтаксис описан в разделе Поддержка полей.
Наконец, положение окна предпросмотра настраивается с помощью --preview-window:
-
--preview-window up:30%— разместить окно вверху с высотой 30% от общей высоты Skim; -
--preview-window left:10:wrap— разместить окно слева шириной 10 символов;wrapвключает перенос строк в выводе команды предпросмотра; -
--preview-window wrap:hidden— скрыть окно предпросмотра при запуске; впоследствии его можно показать действиемtoggle-preview.
Поддержка полей
Как правило, эта возможность нужна лишь авторам плагинов.
Предположим, источник данных имеет формат:
<имя_файла>:<номер_строки>:<номер_столбца>
Но вы хотите искать только по <имя_файла>. То есть при вводе 21 нужно найти файл, чьё имя содержит 21, а не строку или столбец с таким номером.
Для этого используйте sk --delimiter ':' --nth 1.
Также можно применять --with-nth для изменения порядка полей.
Синтаксис диапазонов
-
<num>— указывает поле с номеромnum, нумерация начинается с 1; -
start..— начиная с поляstartи до конца; -
..end— начиная с нулевого поля и до поляendвключительно; -
start..end— начиная с поляstartи до поляendвключительно.
Использование как библиотеки
Skim можно использовать в качестве библиотеки в собственных Rust-крейтах (crates).
Сначала добавьте skim в Cargo.toml:
[dependencies]
skim = { version = "<version>", default-features = false, features = [..] }
Примечание по функциям (features): функция cli нужна для использования skim в качестве CLI-инструмента и, как правило, не требуется при использовании в качестве библиотеки.
Базовое использование
Запустите этот простой пример:
extern crate skim;
use skim::prelude::*;
use std::io::Cursor;
pub fn main() {
let options = SkimOptionsBuilder::default()
.height("50%")
.multi(true)
.build()
.unwrap();
let input = "aaaaa\nbbbb\nccc".to_string();
// `SkimItemReader` — вспомогательный тип для преобразования любого `BufRead` в поток `SkimItem`
// `SkimItem` по умолчанию реализован для `AsRef<str>`
let item_reader = SkimItemReader::default();
let items = item_reader.of_bufread(Cursor::new(input));
// `run_with` читает элементы из потока и отображает их
let selected_items = Skim::run_with(&options, Some(items))
.map(|out| out.selected_items)
.unwrap_or_else(|| Vec::new());
for item in selected_items.iter() {
println!("{}", item.output());
}
}
Тонкое управление
Для более детального управления skim как библиотекой можно использовать tokio и асинхронный код, что позволяет динамически взаимодействовать с
Внутренняя работа
Получив Option<SkimItemReceiver>, skim читает элементы, выполняет свою работу и возвращает выбор пользователя: выбранные элементы, запрос и прочее. Следует учитывать:
-
SkimItemReceiver— этоcrossbeam::channel::Receiver<Arc<dyn SkimItem>>; -
если значение
None, skim вызовет заданную команду и прочитает элементы из её вывода; -
иначе — прочитает элементы из канала (crossbeam).
Трейт SkimItem позволяет настраивать отображение, сравнение и предпросмотр строк. По умолчанию он реализован для AsRef<str>.
Кроме того, SkimItemReader — вспомогательный тип для преобразования BufRead в SkimItemReceiver (из File или String легко получить BufRead), что упрощает работу со строками и файлами.
Больше примеров — в каталоге examples/.
Бенчмарки
Этот бенчмарк запускает интерактивный интерфейс в сеансе tmux и ждёт стабилизации пользовательского интерфейса.
Сгенерировать графики можно с помощью just bench-plot или вручную запустив соответствующий рецепт в GNU bash.
FAQ
Как игнорировать файлы?
Skim вызывает find . для получения списка файлов. Переопределить это поведение можно через переменную окружения SKIM_DEFAULT_COMMAND. Например:
$ SKIM_DEFAULT_COMMAND="fd --type f || git ls-tree -r --name-only HEAD || rg --files || find ."
$ sk
Добавьте это в .bashrc или .zshrc, чтобы сделать настройку постоянной.
Некоторые файлы не отображаются в плагине Vim
Если вы используете плагин Vim и выполняете команду :SK, некоторые файлы могут не отображаться.
Как описано в #3, в плагине Vim переменная SKIM_DEFAULT_COMMAND по умолчанию устанавливается в:
let $SKIM_DEFAULT_COMMAND = "git ls-tree -r --name-only HEAD || rg --files || ag -l -g \"\" || find ."
Это означает, что файлы, не распознанные git, показаны не будут. Вы можете либо переопределить значение по умолчанию командой let $SKIM_DEFAULT_COMMAND = '', либо найти отсутствующие файлы вручную.
Отличия от fzf
fzf — это инструмент нечёткого поиска для командной строки, написанный на Go, а skim — его реализация на Rust, написанная с нуля!
Некоторые решения реализации отличаются от fzf. Например:
-
skimподдерживает интерактивный режим. -
skimподдерживает предварительный выбор (pre-selection). -
Алгоритм нечёткого поиска отличается.
В целом разработчики skim позволяют себе определённую свободу реализации. Цель — сохранить набор возможностей на уровне fzf, однако флаги командной строки могут различаться.
Как внести вклад
Создавайте задачи (issues), если обнаружили ошибки или хотите предложить идеи. Pull-запросы принимаются с радостью.
Тестирование совместимости с Windows
В репозитории есть Vagrantfile для запуска безголовой (headless) виртуальной машины Windows Server 2022 Core — чтобы проверять совместимость с Windows без графического интерфейса. Требуются VirtualBox и Vagrant на хосте (vagrant включён в Nix dev shell через flake.nix).
vagrant up # Первый запуск: скачает образ и настроит систему (~15–20 мин)
ssh -p 2222 vagrant@localhost # Пароль: vagrant
Внутри VM корень проекта смонтирован по пути C:\vagrant:
cd C:\vagrant
cargo build
cargo test
Последующие запуски быстрые — настройка (provisioning) выполняется только один раз:
vagrant halt # Остановить VM
vagrant up # Возобновить работу
vagrant destroy # Полностью удалить VM
Устранение неполадок
Для диагностики происходящего установите переменную окружения SKIM_LOG или флаг --log-level в значение debug или trace, а также переменную SKIM_LOG_FILE или флаг --log-file — путь к файлу журнала. Прочитать журналы можно во время выполнения или после его завершения. Не стесняйтесь прикладывать журналы к задаче (issue), если вам нужна помощь.
Проблемы с переводом строки в nix, FreeBSD, termux
Если у вас возникают проблемы с отображением, например:
$ for n in {1..10}; do echo "$n"; done | sk
0/10 0/0.> 10/10 10 9 8 7 6 5 4 3 2> 1
Примеры подобных проблем:
Необходимо установить переменную TERMINFO или TERMINFO_DIRS, указав путь к корректной базе данных terminfo.
Например, для termux добавьте следующее в .bashrc:
export TERMINFO=/data/data/com.termux/files/usr/share/terminfo
Бенчмарки
Интерактивный бенчмарк (cli)
Бенчмарк cli сравнивает skim (или любой совместимый бинарный файл) с другими версиями или с fzf, запуская интерактивный интерфейс в сеансе tmux и опрашивая строку состояния до стабилизации числа совпадений. Это не прецизионный и не исчерпывающий способ измерения, однако он позволяет сравнивать с fzf и получать метрики по ресурсам (пиковый RSS и загрузка CPU).
cargo bench --bench cli -- run # По умолчанию: sk, 1 млн элементов, запрос "test"
cargo bench --bench cli -- run sk -n 500000 -q foo # Короткое имя разрешается через $PATH
cargo bench --bench cli -- run ./old/sk ./new/sk -r 5 # Сравнить два бинарных файла, по 5 запусков каждый
cargo bench --bench cli -- run sk -f input.txt -q search # Использовать существующий файл
cargo bench --bench cli -- generate -f testdata.txt -n 2000000 # Сгенерировать входной файл и выйти
cargo bench --bench cli -- run sk --perf # Записать данные perf (имя файла генерируется автоматически)
cargo bench --bench cli -- run sk --strace # Записать данные strace (имя файла генерируется автоматически)
cargo bench --bench cli -- run sk -p perf.data # Записать данные perf в файл perf.data
cargo bench --bench cli -- run sk -j # Вывод в формате JSON
cargo bench --bench cli -- run sk -r 3 -- --tiebreak=index # Передать дополнительные флаги в sk
Имена бинарных файлов преобразуются в абсолютные пути через which перед использованием, поэтому короткие имена вроде sk или fzf работают при наличии их в $PATH.
Бенчмарки Criterion
Для более точного измерения производительности Skim доступны бенчмарки Criterion. Чтобы их запустить, сначала сгенерируйте входные данные командой cargo bench --bench cli — -g benches/fixtures/10M.txt -n 10000000 && cargo bench --bench cli — -g benches/fixtures/1M.txt -n 1000000, затем выполните cargo bench -j 1.
Выполнение займёт несколько минут.