1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/mirrors-fzf

Клонировать/Скачать
README-VIM.md 26 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 29.06.2025 17:06 a88d352

Интеграция FZF с Vim

Установка

После установки 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, которая является базовой командой для выбора файлов, построенной на их основе.

  1. fzf#run([spec dict])
    • Запускает fzf внутри Vim с заданным спецификацией
    • :call fzf#run({'source': 'ls'})
  2. 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'}))
  3. :FZF [fzf_options string] [path string]
    • Базовый нечеткий селектор файлов
    • Референсная реализация для тех, кто не хочет писать VimScript для реализации пользовательских команд
    • Если вам нужны другие такие команды, ознакомьтесь с проектом fzf.vim.

Наиболее важной из всех является 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
    • Определяет размер и положение окна fzf
  • g:fzf_colors
    • Настраивает цвета fzf для соответствия текущей цветовой схеме
  • 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
    • Работает только при отсутствии пользовательского приемника (или приемника списка)
      • Наличие пользовательского приемника обычно означает, что каждый элемент не является обычным путем к файлу (например, имя цветовой схемы), поэтому мы не можем слепо применять ту же стратегию (например, команда `'tabedit some-color-scheme' не имеет смысла)
  • g:f zf_colors
  • g:f zf_history_dir

Советы

FZF внутри буфера терминала

В последних версиях 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

Запуск FZF в всплывающем окне

" Обязательные:
" - 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 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/mirrors-fzf.git
git@api.gitlife.ru:oschina-mirror/mirrors-fzf.git
oschina-mirror
mirrors-fzf
mirrors-fzf
master