После установки fzf, вы можете включить его в Vim, просто добавив директорию в &runtimepath
в вашем конфигурационном файле Vim. Путь может отличаться в зависимости от пакетного менеджера.
" Если установлено с помощью Homebrew
set rtp+=/usr/local/opt/fzf
" Если установлено с помощью Homebrew на Apple Silicon
set rtp+=/opt/homebrew/opt/fzf
" Если вы склонировали fzf в директорию ~/.fzf
set rtp+=~/.fzf
Если вы используете vim-plug, то это можно записать так:
" Если установлено с помощью Homebrew
Plug '/usr/local/opt/fzf'
" Если установлено с помощью Homebrew на Apple Silicon
Plug '/opt/homebrew/opt/fzf'
" Если вы склонировали fzf в директорию ~/.fzf
Plug '~/.fzf'
Но если вы хотите использовать последнюю версию плагина Vim из GitHub, а не ту, которая включена в пакет, запишите следующее:
Plug 'junegunn/fzf'
Плагин Vim будет использовать доступный бинарный файл fzf на системе. Если fzf не найден в $PATH
, он спросит, следует ли скачать последнюю версию бинарного файла для вас.
Чтобы убедиться, что у вас установлена последняя версия бинарного файла, настройте пост-обновление хук следующим образом:
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
Плагин Vim для fzf предоставляет две основные функции и команду :FZF
, которая является базовой командой для выбора файлов, построенной на их основе.
fzf#run([spec dict])
:call fzf#run({'source': 'ls'})
fzf#wrap([spec dict]) -> (dict)
fzf#run
и возвращает расширенную версию с дополнительными опциями для учета глобальных предпочтений (g:fzf_xxx
)
:echo fzf#wrap({'source': 'ls'})
fzf#wrap
перед передачей ее в fzf#run
:call fzf#run(fzf#wrap({'source': 'ls'}))
:FZF [fzf_options string] [path string]
Наиболее важной из всех является fzf#run
, но будет легче понять всю картину, начав с команды :FZF
.
:FZF[!]
" Ищет файлы в текущей директории
:FZF
" Ищет файлы в домашней директории
:FZF ~
" С опциями командной строки fzf
:FZF --reverse --info=inline /tmp
" Версия с восклицательным знаком запускает fzf в полноэкранном режиме
:FZF!
Аналогично ctrlp.vim, используйте клавиши Enter, CTRL-T
, CTRL-X
или CTRL-V
для открытия выбранных файлов в текущем окне, новых вкладках, горизонтальных разделах или вертикальных разделах соответственно.
Обратите внимание, что переменные окружения FZF_DEFAULT_COMMAND
и FZF_DEFAULT_OPTS
также применимы здесь.
g:fzf_action
g:fzf_layout
g:fzf_colors
g:fzf_history_dir
" Это настройки дополнительных клавиш по умолчанию
let g:fzf_action = {
\ 'ctrl-t': 'tab split',
\ 'ctrl-x': 'split',
\ 'ctrl-v': 'vsplit' }
" Действие может быть ссылкой на функцию, которая обрабатывает выбранные строки
function! s:build_quickfix_list(lines)
call setqflist(map(copy(a:lines), '{ "filename": v:val, "lnum": 1 }'))
copen
cc
endfunction
let g:fzf_action = {
\ 'ctrl-q': function('s:build_quickfix_list'),
\ 'ctrl-t': 'tab split',
\ 'ctrl-x': 'split',
\ 'ctrl-v': 'vsplit' }
" Настройка макета fzf по умолчанию
" - Всплывающее окно (в центре экрана)
let g:fzf_layout = { 'window': { 'width': 0.9, 'height': 0.6 } }
" - Всплывающее окно (в центре текущего окна)
let g:fzf_layout = { 'window': { 'width': 0.9, 'height': 0.6, 'relative': v:true } }
" - Всплывающее окно (прикрепленное к нижней части текущего окна)
let g:fzf_layout = { 'window': { 'width': 0.9, 'height': 0.6, 'relative': v:true, 'yoffset': 1.0 } }
" - down / up / left / right
let g:fzf_layout = { 'down': '40%' }
" - Окно с использованием команды Vim
let g:fzf_layout = { 'window': 'enew' }
let g:fzf_layout = { 'window': '-tabnew' }
let g:fzf_layout = { 'window': '10new' }
" Настройка цветов fzf для соответствия вашей цветовой схеме
" - fzf#wrap переводит это в набор опций `--color`
let g:fzf_colors =
\ { 'fg': ['fg', 'Normal'],
\ 'bg': ['bg', 'Normal'],
\ 'query': ['fg', 'Normal'],
\ 'hl': ['fg', 'Comment'],
\ 'fg+': ['fg', 'CursorLine', 'CursorColumn', 'Normal'],
\ 'bg+': ['bg', 'CursorLine', 'CursorColumn'],
\ 'hl+': ['fg', 'Statement'],
\ 'info': ['fg', 'PreProc'],
\ 'border': ['fg', 'Ignore'],
\ 'prompt': ['fg', 'Conditional'],
\ 'pointer': ['fg', 'Exception'],
\ 'marker': ['fg', 'Keyword'],
\ 'spinner': ['fg', 'Label'],
\ 'header': ['fg', 'Comment'] }
" Включение истории для каждой команды
" - Файлы истории будут храниться в указанной директории
" - При установке CTRL-N и CTRL-P будут привязаны к 'next-history' и
" 'previous-history' вместо 'down' и 'up'.
let g:fzf_history_dir = '~/.local/share/fzf-history'
g:fzf_colors
g:fzf_colors
— это словарь, сопоставляющий элементы fzf со списком спецификаций цветов:
элемент: [ компонент, группа1 [, группа2, ...] ]
элемент
— это элемент fzf, к которому применяется цвет:
Элемент | Описание |
---|---|
fg / bg / hl
|
Элемент (цвет текста / фон / выделение) |
fg+ / bg+ / hl+
|
Текущий элемент (цвет текста / фон / выделение) |
preview-fg / preview-bg
|
Текст и фон окна предварительного просмотра |
hl / hl+
|
Выделенные подстроки (нормальные / текущие) |
gutter |
Фон левого поля |
pointer |
Указатель на текущую строку (> ) |
marker |
Маркер многострочного выбора (> ) |
border |
Рамка вокруг окна (--border и --preview ) |
header |
Заголовок (--header или --header-lines ) |
info |
Информационная строка (счетчики совпадений) |
spinner |
Индикатор потока входных данных |
query |
Строка запроса |
disabled |
Строка запроса при отключенной поисковой функции |
prompt |
Приглашение перед запросом (> ) |
pointer |
Указатель на текущую строку (> ) |
компонент
указывает компонент (fg
/ bg
) из которого извлекается цвет при рассмотрении каждого из следующих групп выделения
группа1 [, группа2, ...]
— это список групп выделения, которые ищутся (в порядке) для соответствующего определения цвета
Например, рассмотрим следующую спецификацию:
'prompt': ['fg', 'Conditional', 'Comment'],
Это означает, что мы красим приглашение
fg
группы Conditional
, если она существует,fg
группы выделения Comment
, если она существует,Вы можете просмотреть сгенерированный цветовой параметр согласно настройке, выводя результат функции fzf#wrap()
следующим образом:
:echo fzf#wrap()
fzf#run
Функция fzf#run()
является ядром интеграции Vim. Она принимает один аргумент — словарь спецификации, и запускает процесс fzf соответственно. По крайней мере, укажите опцию sink
, чтобы указать, что делать с выбранным элементом.
call fzf#run({'sink': 'e'})
Мы не указали source
, поэтому это эквивалентно запуску fzf в командной строке без стандартного входного потока; fzf будет обходить файловую систему под текущей директорией для получения списка файлов. (Если $FZF_DEFAULT_COMMAND
установлен, fzf будет использовать вывод команды вместо этого.) Когда вы выбираете один файл, он будет открыт с помощью указанного приемника, команды :e
. Если вы хотите открыть его в новой вкладке, вы можете передать команду :tabedit
вместо приемника.
call fzf#run({'sink': 'tabedit'})
Вы можете использовать любую команду оболочки в качестве источника для генерации списка. Следующий пример покажет файлы, управляемые git. Это эквивалентно выполнению команды git ls-files | fzf
в оболочке.
call fzf#run({'source': 'git ls-files', 'sink': 'e'})
Опции fzf могут быть указаны как запись options
в словаре спецификации.
call fzf#run({'sink': 'tabedit', 'options': '--multi --reverse'})
Вы также можете передать опцию макета, если не хотите, чтобы окно fzf занимало весь экран.
" up / down / left / right / window допустимы
call fzf#run({'source': 'git ls-files', 'sink': 'e', 'left': '40%'})
call fzf#run({'source': 'git ls-files', 'sink': 'e', 'window': '30vnew'})
Источник не обязательно должен быть внешней командой оболочки; вы можете передать массив Vim в качестве источника. В следующем примере мы передаем имена цветовых схем в качестве источника для реализации селектора цветовых схем.
call fzf#run({'source': map(split(globpath(&rtp, 'colors/*.vim')),
\ 'fnamemodify(v:val, ":t:r")'),
\ 'sink': 'colo', 'left': '25%'})
Следующая таблица подводит итог доступных опций.
Название опции | Тип | Описание |
---|---|---|
source |
string | Внешняя команда для генерации входных данных для fzf (например, find . ) |
source |
list | Список Vim как входные данные для fzf |
sink |
string | Команда Vim для обработки выбранного элемента (например, e , tabe ) |
sink |
funcref | Функция, вызываемая для каждого выбранного элемента |
sinklist (или sink* ) |
funcref | Аналогично sink , но принимает список строк вывода одновременно |
exit |
funcref | Функция, вызываемая с кодом завершения fzf (например, 0, 1, 2, 130) |
options |
string/list | Опции для fzf |
dir |
string | Рабочая директория |
up /down /left /right
|
number/string | (Макет) Положение и размер окна (например, 20 , 50% ) |
tmux |
string | (Макет) Опции для --tmux (например, 90%,70% ) |
window (Vim 8 / Neovim) |
string | (Макет) Команда для открытия окна fzf (например, vertical aboveleft 30new ) |
window (Vim 8 / Neovim) |
dict | (Макет) Настройки всплывающего окна (например, {'width': 0.9, 'height': 0.6} ) |
Запись options
может быть либо строкой, либо списком. Для простых случаев строка должна быть достаточной, но предпочтительно использовать тип списка для избежания проблем с экранированием.
call fzf#run({'options': '--reverse --prompt "C:\\Program Files\\"'})
call fzf#run({'options': ['--reverse', '--prompt', 'C:\Program Files\']})
Когда запись window
является словарем, fzf будет запускаться в всплывающем окне. Допустимы следующие опции:
width
[число диапазона [0 ~ 1]] или [целое число диапазона [8 ~ ]]height
[число диапазона [0 ~ 1]] или [целое число диапазона [4 ~ ]]yoffset
[число по умолчанию 0.5 диапазона [0 ~ 1]]xoffset
[число по умолчанию 0.5 диапазона [0 ~ 1]]relative
[логическое значение по умолчанию v:false]border
[строка по умолчанию 'rounded'
(sharp
на Windows)]: Стиль границы
'rounded' /
'sharp' / 'horizontal' /
'vertical' / 'top' /
'bottom' / 'left' /
'right' / 'no[ne]'
fzf#wrap
Мы видели, что несколько аспектов команды :FZF
можно настроить с помощью набора глобальных переменных; различные способы открытия файлов (g:fzf_action
), положение и размер окна (g:fzf_layout
), палитра цветов (g:fzf_colors
) и т.д.
Так как же мы можем сделать так, чтобы наши пользовательские вызовы fzf#run
также учитывали эти переменные? Просто "обернув" словарь спецификации с помощью функции fzf#wrap
, прежде чем передавать его в fzf#run
.
fzf#wrap([name string], [spec dict], [fullscreen bool]) -> (dict)
name
используется для управления файлами истории. Игнорируется, если не определена переменная g:fzf_history_dir
.fullscreen
может быть либо 0
, либо 1
(по умолчанию: 0).Функция fzf#wrap
принимает спецификацию и возвращает расширенную версию (также словарь) с дополнительными опциями для учета глобальных предпочтений. Вы можете просмотреть возвращаемое значение следующим образом:
echo fzf#wrap({'source': 'ls'})
После того как мы "обернули" нашу спецификацию, мы передаем ее в функцию fzf#run
.
call f zf#run(f zf#wrap({'source': '`ls'}))
Теперь она поддерживает клавиши сочетания клавиш CTRL-T
, CTRL-V
, и CTRL-X
(конфигурируемые через переменную g:f zf_action
) и открывает окно f zf согласно настройке переменной g:f zf_layout
.
Чтобы сделать использование проще, давайте определим команду LS
.
command! LS call f zf#run(f zf#wrap({'source': '`ls'}))
Введите команду :LS
, чтобы увидеть, как она работает.
Мы хотели бы сделать так, чтобы версия команды с восклицательным знаком (:LS!
) открывала f zf в полноэкранном режиме, как и команда :FZF!
. Добавьте -bang
к определению команды и используйте значение <bang>
для установки последнего аргумента функции f zf#wrap
.
" При выполнении :LS!, <bang> оценивается как '!'. '!0' становится равным 1.
command! -bang LS call f zf#run(f zf#wrap({'source': '`ls'}, <bang>0))
Наша команда :LS
будет намного полезнее, если мы сможем передать аргумент директории ей, чтобы было возможно что-то вроде команды :LS /tmp
.
command! -bang -complete=dir -nargs=? LS
\ call f zf#run(f zf#wrap({'source': '`ls', '`dir`: <q-args>}, <bang>0))
Наконец, если вы включили переменную g:f zf_history_dir
, вы можете назначить уникальное имя нашей команде и передать его как первый аргумент функции f zf#wrap
.
" История запросов этой команды будет храниться как '`ls' внутри g:f zf_history_dir.
" Имя игнорируется, если не определена переменная g:f zf_history_dir.
command! -bang -complete=dir -nargs=? LS
\ call f zf#run(f zf#wrap('ls', {'source': '`ls', '`dir`: <q-args>}, <bang>0))
f zf#wrap
g:f zf_layout
g:f zf_action
g:f zf_colors
g:f zf_history_dir
В последних версиях Vim и Neovim f zf будет запускаться внутри буфера терминала. Если вы заметите, что стандартные цвета ANSI отличаются от ожидаемых, рассмотрите возможность настройки цветов с помощью переменной 'g:terminal_ansi_colors' в обычном Vim или переменной
'g:terminal_color_x' в Neovim.
" Цвета терминала для цветовой схемы seoul256
if has('nvim')
let g:terminal_color_0 = '#4e4e4e'
let g:terminal_color_1 = '#d68787'
let g:terminal_color_2 = '#5f865f'
let g:terminal_color_3 = '#d8af5f'
let g:terminal_color_4 = '#85add4'
let g:terminal_color_5 = '#d7afaf'
let g:terminal_color_6 = '#87afaf'
let g:terminal_color_7 = '#d0d0d0'
let g:terminal_color_8 = '#626262'
let g:terminal_color_9 = '#d75f87'
let g:terminal_color_10 = '#87af87'
let g:terminal_color_11 = '#ffd787'
let g:terminal_color_12 = '#add4fb'
let g:terminal_color_13 = '#ffafaf'
let g:terminal_color_14 = '#87d7d7'
let g:terminal_color_15 = '#e4e4e4'
else
let g:terminal_ansi_colors = [
\ '#4e4e4e', '#d68787', '#5f865f', '#d8af5f',
\ '#85add4', '#d7afaf', '#87afaf', '#d0d0d0',
\ '#626262', '#d75f87', '#87af87', '#ffd787',
\ '#add4fb', '#ffafaf', '#87d7d7', '#e4e4e4'
\ ]
endif
" Обязательные:
" - width [число диапазона [0 ~ 1]] или [целое число диапазона [8 ~ ]]
" - height [число диапазона [0 ~ 1]] или [целое число диапазона [4 ~ ]]
"
" Необязательные:
" - xoffset [число по умолчанию 0.5 диапазона [0 ~ 1]]
" - yoffset [число по умолчанию 0.5 диапазона [0 ~ 1]]
" - relative [логическое значение по умолчанию v:false]
" - border [строка по умолчанию `'rounded'`: Стиль границы]
" - `'rounded' / `'sharp' / `'horizontal' / `'vertical' / `'top' / `'bottom' / `'left' / `'right'
let g:f zf_layout = { '`window`: { '`width`: 0.9, '`height`: 0.6 } }
Альтернативно, вы можете заставить FZF открываться в всплывающем окне tmux (требуется tmux версии 3.2 или выше), указав значение опции '--tmux' в ключе
'tmux'.
" См. опцию '--tmux' в man f zf для доступных опций
" [center|top|bottom|left|right][,SIZE[%]][,SIZE[%]]
if exists('$TMUX')
let g:f zf_layout = { '`tmux`: '`90%,70%' }
else
let g:f zf_layout = { '`window`: { '`width`: 0.9, '`height`: 0.6 } }
endif
Когда FZF запускается внутри буфера терминала, тип буфера устанавливается как 'f zf'. Таким образом, вы можете настроить автокоманду
'FileType f zf' для настройки параметров окна.
Например, если вы открываете FZF внизу экрана (например, { '
down: '
40%' }'), вы можете временно отключить строку состояния для более чистого внешнего вида.
let g:f zf_layout = { '`down`: '`30%' }
autocmd! FileType f zf
autocmd FileType f zf set laststatus=0 noshowmode noruler
\| autocmd BufLeave <buffer> set laststatus=2 showmode ruler
Лицензия MIT (MIT)
Авторские права © 2013-2024 Junegunn Choi
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )