fzf — это универсальный командный фильтр с нечетким поиском.
Это интерактивная программа фильтрации для любых списков; файлов, истории команд, процессов, хостов, закладок, коммитов Git и т.д. Она реализует алгоритм "нечеткого" поиска, что позволяет быстро вводить шаблоны с пропущенными символами и все равно получать нужные результаты.
Вы можете использовать [Homebrew] (https://brew.sh/) (на macOS или Linux) для установки fzf.
brew install fzf
[!ВАЖНО] Для настройки интеграции с оболочкой (сочетания клавиш и нечеткое завершение), см. [инструкции ниже] (#настройка-интеграции-с-оболочкой).
fzf также доступен через MacPorts: sudo port install fzf
Диспетчер пакетов | Линукс дистрибутив | Команда |
---|---|---|
APK | Alpine Linux | sudo apk add fzf |
APT | Debian 9+/Ubuntu 19.10+ | sudo apt install fzf |
Conda | conda install -c conda-forge fzf |
|
DNF | Fedora | sudo dnf install fzf |
Nix | NixOS, и т.д. | nix-env -iA nixpkgs.fzf |
Pacman | Arch Linux | sudo pacman -S fzf |
pkg | FreeBSD | pkg install fzf |
pkgin | NetBSD | pkgin install fzf |
pkg_add | OpenBSD | pkg_add fzf |
Portage | Gentoo | emerge --ask app-shells/fzf |
Spack | spack install fzf |
|
XBPS | Void Linux | sudo xbps-install -S fzf |
Zypper | openSUSE | sudo zypper install fzf |
[!ВАЖНО] Для настройки интеграции с оболочкой (сочетания клавиш и нечеткое завершение), см. [инструкции ниже] (#настройка-интеграции-с-оболочкой).
На Windows, fzf доступен через Chocolatey, Scoop, Winget и MSYS2:
Диспетчер пакетов | Команда |
---|---|
Chocolatey | choco install fzf |
Scoop | scoop install fzf |
Winget | winget install fzf |
MSYS2 (pacman) | pacman -S $MINGW_PACKAGE_PREFIX-fzf |
Альтернативно, вы можете "git clone" этот репозиторий в любую директорию и запустить скрипт установки.
git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
~/.fzf/install
Скрипт установки добавит строки в ваш файл конфигурации оболочки для изменения $PATH
и настройки интеграции с оболочкой.
Вы можете скачать официальные бинарные файлы fzf со страницы релизов.
Добавьте следующую строку в ваш файл конфигурации оболочки.
# Настройка сочетаний клавиш и нечеткого завершения fzf
eval "$(fzf --bash)"
# Настройка сочетаний клавиш и нечеткого завершения fzf
source <(fzf --zsh)
# Настройка сочетаний клавиш fzf
fzf --fish | source
[!ЗАМЕТКА] Опции
--bash
,--zsh
и--fish
доступны только в версии fzf 0.48.0 или новее. Если у вас старая версия fzf или вы хотите более тонкую настройку, вы можете подключить отдельные скрипты в директории [/shell]. Расположение файлов может различаться в зависимости от используемого диспетчера пакетов. Подробнее см. документацию пакета (например,apt show fzf
).
[!СОВЕТ] Вы можете отключить связку CTRL-T или ALT-C, установив
FZF_CTRL_T_COMMAND
илиFZF_ALT_C_COMMAND
в пустую строку при подключении скрипта. Например, чтобы отключить связку ALT-C:
- bash:
FZF_ALT_C_COMMAND= eval "$(fzf --bash)"
- zsh:
FZF_ALT_C_COMMAND= source <(fzf --zsh)
- fish:
fzf --fish | FZF_ALT_C_COMMAND= source
Установка переменных после подключения скрипта не будет иметь эффекта.
Если вы используете [vim-plug], добавьте следующее в ваш файл конфигурации Vim:
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
Plug 'junegunn/fzf.vim'
junegunn/fzf
предоставляет базовые функции библиотеки
fzf#install()
гарантирует, что у вас последняя версия бинарного файлаjunegunn/fzf.vim
— это отдельный проект, который предоставляет множество полезных командДля получения дополнительной информации о интеграции с Vim см. файл README-VIM.md.
[!СОВЕТ] Если вы используете Neovim и предпочитаете плагины на Lua, ознакомьтесь с проектом [fzf-lua].
fzf активно развивается, и вам может потребоваться время от времени его обновить. Пожалуйста, следуйте инструкциям ниже в зависимости от метода установки.
cd ~/.fzf && git pull && ./install
brew update; brew upgrade fzf
sudo port upgrade fzf
choco upgrade fzf
:PlugUpdate fzf
Для подробностей см. файл BUILD.md.
fzf запускает интерактивный фильтр, читает список из STDIN и записывает выбранный элемент в STDOUT.
find * -type f | fzf > selected
Без пайпа STDIN, fzf будет обходить файловую систему в текущей директории для получения списка файлов.
vim $(fzf)
[!ЗАМЕТКА] Вы можете переопределить поведение по умолчанию:
- Либо установив
$FZF_DEFAULT_COMMAND
на команду, которая генерирует нужный список- Либо установив опции
--walker
,--walker-root
, и--walker-skip
в$FZF_DEFAULT_OPTS
[!ПРЕДУПРЕЖДЕНИЕ] Более надежное решение — использовать
xargs
, но мы представили вышеупомянутое решение, так как оно проще для понимания.fzf --print0 | xargs -0 -o vim
[!СОВЕТ] fzf также имеет возможность преобразовать себя в другой процесс.
fzf --bind 'enter:become(vim {})'
Подробнее см. раздел [Преобразование в другой процесс] (#преобразование-в-другой-процесс).
CTRL-K
/ CTRL-J
(или CTRL-P
/ CTRL-N
) для перемещения курсора вверх и внизEnter
для выбора элемента, CTRL-C
/ CTRL-G
/ ESC
для выхода-m
), TAB
и Shift-TAB
для отметки нескольких элементовПо умолчанию fzf работает в полноэкранном режиме, но есть другие режимы отображения.
--height
С опцией --height HEIGHT[%]
, fzf начнет под курсором с заданной высотой.
fzf --height 40%
Опции reverse
layout и --border
хорошо сочетаются с этой опцией.
fzf --height 40% --layout reverse --border
Добавив символ ~
перед высотой, вы устанавливаете максимальную высоту.
# Будет занимать минимальное количество строк для отображения списка
seq 3 | fzf --height ~100%
seq 3000 | fzf --height ~100%
Значение высоты может быть отрицательным числом.
# Высота экрана - 3
fzf --height -3
--tmux
С опцией --tmux
, fzf начнет в попапе tmux.
# --tmux [center|top|bottom|left|right][,SIZE[%]][,SIZE[%][,border-native]]
fzf --tmux center # Центр, 50% ширины и высоты
fzf --tmux 80% # Центр, 80% ширины и высоты
fzf --tmux 100%,50% # Центр, 100% ширины и 50% высоты
fzf --tmux left,40% # Слева, 40% ширины
fzf --tmux left,40%,90% # Слева, 40% ширины, 90% высоты
fzf --tmux top,40% # Сверху, 40% высоты
fzf --tmux bottom,80%,40% # Снизу, 80% высоты, 40% высоты
Опция --tmux
игнорируется, если вы не находитесь в tmux.
[!ЗАМЕТКА] Если у вас старая версия tmux, которая не поддерживает попапы, или если вы хотите открыть fzf в обычном панели tmux, ознакомьтесь со скриптом [fzf-tmux].
[!СОВЕТ] Вы можете добавить эти опции в
$FZF_DEFAULT_OPTS
, чтобы они применялись по умолчанию. Например,# Открывать в попапе tmux, если находитесь в tmux, иначе использовать режим --height export FZF_DEFAULT_OPTS='--height 40% --tmux bottom,40% --layout reverse --border top'
Если не указано иное, fzf начинает в режиме "расширенного поиска", где вы можете вводить несколько поисковых терминов, разделенных пробелами. Например: ^music .mp3$ sbtrkt !fire
Токен | Тип совпадения | Описание |
---|---|---|
sbtrkt |
Нечеткое совпадение | Элементы, которые совпадают с sbtrkt
|
'wild' |
Точное совпадение (в кавычках) | Элементы, которые содержат wild
|
'wild' |
Точное совпадение на границах слов (в кавычках с обеих сторон) | Элементы, которые содержат wild на границах слов |
^music |
Точное совпадение префикса | Элементы, которые начинаются с music
|
.mp3$ |
Точное совпадение суффикса | Элементы, которые заканчиваются на .mp3
|
!fire |
Обратное точное совпадение | Элементы, которые не содержат fire
|
!^music |
Обратное точное совпадение префикса | Элементы, которые не начинаются с music
|
!.mp3$ |
Обратное точное совпадение суффикса | Элементы, которые не заканчиваются на .mp3
|
Если вы не предпочитаете нечеткое совпадение и не хотите "кавычить" каждое слово,
запустите fzf с опцией -e
или --exact
. Обратите внимание, что при установке опции --exact
,
префикс '
"раскрывает" термин.
Одиночный символ тире (|
) действует как оператор OR. Например, следующий запрос соответствует записям,
начинающимся с core
и заканчивающимся на либо go
, либо rb
, либо py
.
^core go$ | rb$ | py$
FZF_DEFAULT_COMMAND
export FZF_DEFAULT_COMMAND='fd --type f'
FZF_DEFAULT_OPTS
export FZF_DEFAULT_OPTS="--layout=reverse --inline-info"
FZF_DEFAULT_OPTS_FILE
export FZF_DEFAULT_OPTS_FILE=~/.fzfrc
[!ПРЕДУПРЕЖДЕНИЕ] Переменная
$FZF_DEFAULT_COMMAND
не используется интеграцией с оболочкой из-за небольших различий в требованиях.
CTRL-T
выполняет$FZF_CTRL_T_COMMAND
, чтобы получить список файлов и директорийALT-C
выполняет$FZF_ALT_C_COMMAND
, чтобы получить список директорийvim ~/**<tab>
выполняет функциюf zf_compgen_path()
с префиксом (~/
) как первым аргументомcd foo**<tab>
выполняет функциюf zf_compgen_dir()
с префиксом (foo
) как первым аргументомДоступные опции описаны далее в этом документе.
Пользовательский интерфейс fzf полностью настраиваемый с большим количеством опций конфигурации. Для быстрой настройки вы можете начать с одного из предустановленных стилей — default
, full
, или minimal
— используя опцию --style
.
f zf --style full \
--preview 'f zf-preview.sh {}' --bind 'focus:transform-header:file --brief {}'
Предустановленный стиль | Скриншот |
---|---|
default |
![]() |
full |
![]() |
minimal |
![]() |
Вот пример на основе предустановленного стиля full
:
git ls-files | f zf --style full \
--border --padding 1,2 \
--border-label ' Demo ' --input-label ' Input ' --header-label ' File Type ' \
--preview 'f zf-preview.sh {}' \
--bind 'result:transform-list-label:
if [[ -z $FZF_QUERY ]]; then
echo " $FZF_MATCH_COUNT items "
else
echo " $FZF_MATCH_COUNT matches for [$FZF_QUERY] "
fi
' \
--bind 'focus:transform-preview-label:[[ -n {} ]] && printf " Previewing [%s] " {}' \
--bind 'focus:+transform-header:file --brief {} || echo "No file selected"' \
--bind 'ctrl-r:change-list-label( Reloading the list )+reload(sleep 2; git ls-files)' \
--color 'border:#aaaaaa,label:#cccccc' \
--color 'preview-border:#9999cc,preview-label:#ccccff' \
--color 'list-border:#669966,list-label:#99cc99' \
--color 'input-border:#996666,input-label:#ffcccc' \
--color 'header-border:#6699cc,header-label:#99ccff'
Для полного списка опций см. страницу руководства (f zf --man
или man f zf
).
Если вы предпочитаете учиться по видео, ознакомьтесь с этим видеороликом от [@samoshkin], чтобы узнать о возможностях f zf.
После настройки интеграции с оболочкой ([настройка интеграции с оболочкой] (#настройка-интеграции-с-оболочкой)), вы можете использовать следующие клавиатурные сочетания в bash, zsh и fish.
--walker file,dir,follow,hidden
.
$FZF_CTRL_T_COMMAND
на пользовательскую команду.--walker*
в переменной $FZF_CTRL_T_OPTS
.$FZF_CTRL_T_OPTS
, чтобы передать дополнительные опции в f zf.
# Предварительный просмотр содержимого файла с помощью bat (https://github.com/sharkdp/bat)
export FZF_CTRL_T_OPTS="
--walker-skip .git,node_modules,target
--preview 'bat -n --color=always {}'
--bind 'ctrl-/ :change-preview-window(down hidden )'"
$FZF_CTRL_T_COMMAND
на пустую строку при подключении скрипта.$FZF_CTRL_R_OPTS
, чтобы передать дополнительные опции в f zf.
# CTRL-Y для копирования команды в буфер обмена с помощью pbcopy.
export FZF_CTRL_R_OPTS="
--bind 'ctrl-y:execute-silent(echo -n {2..} pbcopy)+abort'
--color header:italic
--header 'Нажмите CTRL-Y для копирования команды в буфер обмена'"
--walker dir,follow
.$FZF_ALT_C_COMMAND
, чтобы переопределить команду по умолчанию.
--walker-*
в переменной $FZF_ALT_C_OPTS
.$FZF_ALT_C_OPTS
, чтобы передать дополнительные опции в f zf.
# Вывод древовидной структуры в окне предварительного просмотра.
export FZF_ALT_C_OPTS="
--walker-skip .git,node_modules,target
--preview 'tree -C {}'"
$FZF_ALT_C_COMMAND
на пустую строку при подключении скрипта.Режимы отображения для этих сочетаний клавиш можно настроить отдельно через переменные $FZF_{CTRL_T,CTRL_R,ALT_C}_OPTS
или глобально через переменную $FZF_DEFAULT_OPTS
.
(например: $FZF_CTRL_R_OPTS='--tmux bottom,60% height 60% border top'
)Больше советов можно найти на странице wiki (https://github.com/junegunn/fzf/wiki/Configuring-shell-key-bindings).
Нечеткое завершение для файлов и директорий можно вызвать, если слово перед курсором заканчивается последовательностью триггеров, которая по умолчанию равна **.
[DIRECTORY/][FUZZY_PATTERN]**<TAB>
# Файлы в текущей директории.
# Вы можете выбрать несколько элементов с помощью клавиши TAB.
vim **<TAB>
# Файлы в родительской директории.
vim ../**<TAB>
# Файлы в родительской директории, соответствующие "fzf".
vim ../fzf**<TAB>
# Файлы в домашней директории.
vim ~/**<TAB>
# Директории в текущей директории (одиночный выбор).
cd **<TAB>
# Директории в ~/github, соответствующие "fzf".
cd ~/github/fzf**<TAB>
Нечеткое завершение для PID предоставляется для команды kill.
# Можно выбрать несколько процессов с помощью клавиш TAB или Shift-TAB.
kill -9 **<TAB>
Для команд ssh и telnet предоставляется нечеткое завершение для хостов. Имена извлекаются из /etc/hosts и ~/.ssh/config.
ssh **<TAB>
telnet **<TAB>
unset **<TAB>
export **<TAB>
unalias **<TAB>
# Использовать ~~ вместо стандартной последовательности **.
export FZF_COMPLETION_TRIGGER='~~'
# Опции для команды fzf.
export FZF_COMPLETION_OPTS='--border info inline'
# Опции для завершения путей (например: vim **<TAB>).
export FZF_COMPLETION_PATH_OPTS='--walker file dir follow hidden'
# Опции для завершения директорий (например: cd **<TAB>).
export FZF_COMPLETION_DIR_OPTS='--walker dir follow'
# Расширенная настройка опций fzf через функцию _fzf_comprun.
_fzf_comprun() {
local command=$1
shift
case "$command" in
cd) fzf --preview 'tree -C {} head -200' "$@" ;;
export unset) fzf --preview "eval 'echo \$'{}" "$@" ;;
ssh) fzf --preview 'dig {}' "$@" ;;
*) fzf --preview 'bat -n color always {}' "$@" ;;
esac
}
# Использование fd (https://github.com/sharkdp/fd) для генерации списка путей.
_fzf_compgen_path() {
fd hidden follow exclude ".git" . "$1"
}
# Использование fd для генерации списка директорий.
_fzf_compgen_dir() {
fd type d hidden follow exclude ".git" . "$1"
}
В bash нечеткое завершение включено только для предопределенного набора команд (выполните команду complete -p | grep _fzf
, чтобы увидеть список).
FZF_DEFAULT_COMMAND='find . -type f' \
fzf --bind 'ctrl-d:reload(find . -type d),ctrl-f:reload(eval "$FZF_DEFAULT_COMMAND")' \
--height=50% --layout=reverse
Приведенный ниже пример использует fzf в качестве интерфейса выбора для ripgrep. Мы привязали действие reload
к событию change
, поэтому каждый раз, когда вы вводите текст в fzf, процесс ripgrep перезапускается с обновленной строкой запроса, обозначенной заполнителем {q}
. Также обратите внимание, что мы использовали опцию --disabled
, чтобы fzf не выполнял никакого вторичного фильтрации.
: | rg_prefix='rg --column --line-number --no-heading --color=always --smart-case' \
fzf --bind 'start:reload:$rg_prefix ""' \
--bind 'change:reload:$rg_prefix {q} || true' \
--bind 'enter:become(vim {1} +{2})' \
--ansi --disabled \
--height=50% --layout=reverse
Если ripgrep не находит совпадений, он завершится с ненулевым кодом возврата, и fzf предупредит вас об этом. Чтобы подавить сообщение об ошибке, мы добавили || true
к команде, чтобы она всегда завершалась с кодом 0.
См. "Использование fzf как интерактивного запускателя Ripgrep" для более сложных примеров.
Когда опция --preview
установлена, fzf автоматически запускает внешний процесс с текущей строкой в качестве аргумента и показывает результат в разделенном окне. Ваш $SHELL
используется для выполнения команды с помощью $SHELL -c COMMAND
. Окно можно прокручивать с помощью мыши или пользовательских клавиш.
# {} заменяется на одинарно-закавыченную строку фокусируемой строки
fzf --preview 'cat {}'
Предварительное окно поддерживает цвета ANSI, поэтому вы можете использовать любую программу, которая подсвечивает синтаксис содержимого файла, например, Bat или Highlight:
fzf --preview 'bat --color=always {}' --preview-window '~3'
Вы можете настроить размер, положение и границу предварительного окна с помощью опции --preview-window
, а также цвет переднего и заднего плана с помощью опции --color
. Например,
fzf --height 40% --layout reverse --info inline --border \
--preview 'file {}' --preview-window up,1,border-horizontal \
--bind 'ctrl-/:change-preview-window(50%|hidden|)' \
--color 'fg:#bbccdd,fg+:#ddeeff,bg:#334455,preview-bg:#223344,border:#778899'
См. страницу руководства (man fzf
) для полного списка опций.
Более сложные примеры можно найти здесь.
[!WARNING] Поскольку fzf является универсальным текстовым фильтром, а не поиском файлов, не следует добавлять опцию
--preview
в ваш$FZF_DEFAULT_OPTS
.# ********************* # ** НЕ ДЕЛАЙТЕ ЭТО! ** # ********************* export FZF_DEFAULT_OPTS='--preview "bat --style=numbers --color=always --line-range :500 {}"' # bat не работает с любым входом, кроме списка файлов ps -ef | fzf seq 100 | fzf history | fzf
fzf может отображать изображения в предварительном окне с использованием одного из следующих протоколов:
См. скрипт bin/fzf-preview.sh для получения дополнительной информации.
fzf --preview 'fzf-preview.sh {}'
.gitignore
Вы можете использовать fd,
ripgrep или the silver
searcher для обхода файловой системы с учетом .gitignore
.
# Передайте вывод fd в fzf
fd --type f --strip-cwd-prefix | fzf
# Установите fd как источник по умолчанию для fzf
export FZF_DEFAULT_COMMAND='fd --type f --strip-cwd-prefix'
# Теперь fzf (без конвейера) будет использовать команду fd для генерации списка
fzf
# Чтобы применить команду к CTRL-T также
export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND"
Если вы хотите, чтобы команда следовала символическим ссылкам и не исключала скрытые файлы, используйте следующую команду:
export FZF_DEFAULT_COMMAND='fd --type f --strip-cwd-prefix --hidden --follow --exclude .git'
Клавиша CTRL-T
в fish, в отличие от bash и zsh, будет использовать последний токен на командной строке в качестве корневого каталога для рекурсивного поиска. Например, нажатие CTRL-T
в конце следующей командной строки
ls /var/
покажет все файлы и директории под /var/
.
При использовании пользовательской FZF_CTRL_T_COMMAND
используйте неразвернутую переменную $dir
, чтобы воспользоваться этой функцией. $dir
по умолчанию равен .
при условии, что последний токен не является допустимым каталогом. Пример:
set -g FZF_CTRL_T_COMMAND "command find -L \$dir -type f 2> /dev/null | sed '1d; s#^\./##'"
fzf Theme Playground создана Vitor Mello — это веб-страница, где вы можете интерактивно создавать темы для fzf.
https://github.com/junegunn/fzf/wiki/Related-projects
The MIT License (MIT)
Copyright (c) 2013-2024 Junegunn Choi
Я хотел бы поблагодарить всех спонсоров этого проекта, благодаря которым мне удается продолжать его развитие.
Если вы хотите поддержать этот проект, пожалуйста, посетите https://github.com/sponsors/junegunn.
JetBrains поддерживает этот проект лицензией для разработки открытого исходного кода.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )