Skim: нечёткий поиск на Rust вместо grep

Мы тратим огромную часть своего времени на навигацию по файлам, строкам и командам. Именно здесь на помощь приходит Skim! Это мощный инструмент нечёткого поиска (fuzzy finder), призванный сделать вашу работу быстрее и эффективнее.

Жизнь коротка — skim!

Мы тратим огромную часть своего времени на навигацию по файлам, строкам и командам. Именно здесь на помощь приходит Skim! Это мощный инструмент нечёткого поиска, призванный сделать вашу работу быстрее и эффективнее.

Skim предоставляет единственный исполняемый файл — sk. Думайте о нём как об умной альтернативе инструментам вроде grep: стоит попробовать один раз, и вы уже не сможете представить, как обходились без него.

Установка

Проект Skim включает несколько компонентов:

  1. Исполняемый файл sk — основная программа.

  2. Плагин для Vim/Nvim — для вызова sk внутри Vim/Nvim. Поддержка Vim описана в файле skim.vim.

Менеджеры пакетов

ОС Менеджер пакетов Команда

macOS

Homebrew

brew install sk

macOS

MacPorts

sudo port install skim

Alpine

apk

apk add skim

Arch

pacman

pacman -S skim

Fedora

COPR

см. ниже

Gentoo

Portage

emerge --ask app-misc/skim

Guix

guix

guix install skim

Void

XBPS

xbps-install -S skim

Windows

winget

winget install skim

Windows

Scoop

scoop install skim

Debian/Ubuntu

apt

см. ниже

Fedora/RHEL

dnf

см. ниже

Debian/Ubuntu

Специальный APT-репозиторий доступен и обновляется автоматически при каждом релизе:

  1. Импортируйте ключ подписи

С помощью 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
  1. Добавьте репозиторий

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
  1. Установите пакет

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

Переключить выделение и перейти вниз (при флаге -m)

Shift-TAB

Переключить выделение и перейти вверх (при флаге -m)

Полный список привязок клавиш приведён в странице руководства (man sk).

Синтаксис поиска

skim использует синтаксис fzf для сопоставления элементов:

Токен Тип совпадения Описание

text

нечёткое совпадение

элементы, совпадающие с text

^music

точное совпадение с началом строки

элементы, начинающиеся с music

.mp3$

точное совпадение с концом строки

элементы, заканчивающиеся на .mp3

'wild

точное совпадение (в кавычках)

элементы, содержащие wild

!fire

инверсное точное совпадение

элементы, не содержащие fire

!.mp3$

инверсное совпадение с концом строки

элементы, не заканчивающиеся на .mp3

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 (красный текст)

Доступные элементы для настройки цветов

Элемент Описание Пример

fg

Цвет обычного текста

--color=fg:232

bg

Цвет фона обычного текста

--color=bg:255

matched

Совпавший текст в результатах поиска

--color=matched:108

matched_bg

Фон совпавшего текста

--color=matched_bg:0

current

Цвет текста текущей строки

--color=current:254

current_bg

Цвет фона текущей строки

--color=current_bg:236

current_match

Совпавший текст в текущей строке

--color=current_match:151

current_match_bg

Фон совпавшего текста в текущей строке

--color=current_match_bg:236

spinner

Цвет индикатора прогресса

--color=spinner:148

info

Цвет информационной строки

--color=info:144

prompt

Цвет строки приглашения

--color=prompt:110

cursor

Цвет курсора

--color=cursor:161

selected

Цвет маркера выбранного элемента

--color=selected:168

header

Цвет заголовка

--color=header:109

border

Цвет рамки области предпросмотра / раскладки

--color=border:59

scrollbar

Цвет ползунка полосы прокрутки списка

--color=scrollbar:59

Примеры

# Светлая тема с изменённым фоном текущей строки
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 принимает данные двух видов: вывод команды или данные из пайпа.

  • 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. Например:

  1. skim поддерживает интерактивный режим.

  2. skim поддерживает предварительный выбор (pre-selection).

  3. Алгоритм нечёткого поиска отличается.

В целом разработчики 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.

Выполнение займёт несколько минут.

© 2026 meganuke