254 lines
10 KiB
Text
254 lines
10 KiB
Text
fzf-vim.txt fzf-vim Last change: September 20 2015
|
||
FZF-VIM - TABLE OF CONTENTS *fzf-vim* *fzf-vim-toc*
|
||
==============================================================================
|
||
|
||
fzf :heart: vim
|
||
Rationale
|
||
Why you should use fzf on Vim
|
||
Installation
|
||
Commands
|
||
Customization
|
||
Mappings
|
||
Usage
|
||
Completion helper
|
||
Reducer example
|
||
License
|
||
|
||
FZF :HEART: VIM *fzf-vim-fzf-heart-vim*
|
||
==============================================================================
|
||
|
||
Things you can do with {fzf}{1} and Vim.
|
||
|
||
{1} https://github.com/junegunn/fzf
|
||
|
||
|
||
RATIONALE *fzf-vim-rationale*
|
||
==============================================================================
|
||
|
||
{fzf}{1} in itself is not a Vim plugin, and the official repository only
|
||
provides the {basic wrapper function}{2} for Vim and it's up to the users to
|
||
write their own Vim commands with it. However, I've learned that many users of
|
||
fzf are not familiar with Vimscript and are looking for the "default"
|
||
implementation of the features they can find in the alternative Vim plugins.
|
||
|
||
This repository is a bundle of fzf-based commands and mappings extracted from
|
||
my {.vimrc}{3} to address such needs. They are not designed to be flexible or
|
||
configurable, and there's no guarantee of backward-compatibility.
|
||
|
||
{1} https://github.com/junegunn/fzf
|
||
{2} https://github.com/junegunn/fzf#usage-as-vim-plugin
|
||
{3} https://github.com/junegunn/dotfiles/blob/master/vimrc
|
||
|
||
|
||
WHY YOU SHOULD USE FZF ON VIM *fzf-vim-why-you-should-use-fzf-on-vim*
|
||
==============================================================================
|
||
|
||
Because you can and you love fzf.
|
||
|
||
fzf runs asynchronously and can be orders of magnitude faster than similar Vim
|
||
plugins. However, the benefit may not be noticeable if the size of the input
|
||
is small, which is the case for many of the commands provided here.
|
||
Nevertheless I wrote them anyway since it's really easy to implement custom
|
||
selector with fzf.
|
||
|
||
fzf is an independent command-line program and thus requires an external
|
||
terminal emulator when on GVim. You may or may not like the experience. Also
|
||
note that fzf currently does not compile on Windows.
|
||
|
||
|
||
INSTALLATION *fzf-vim-installation*
|
||
==============================================================================
|
||
|
||
Using {vim-plug}{4}:
|
||
>
|
||
Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': 'yes \| ./install' }
|
||
Plug 'junegunn/fzf.vim'
|
||
<
|
||
{4} https://github.com/junegunn/vim-plug
|
||
|
||
|
||
COMMANDS *fzf-vim-commands*
|
||
==============================================================================
|
||
|
||
|
||
-----------------+-------------------------------------------------------------------
|
||
Command | List ~
|
||
-----------------+-------------------------------------------------------------------
|
||
`Files [PATH]` | Files (similar to `:FZF` )
|
||
`GitFiles` | Git files (git ls-files)
|
||
`GitFiles?` | Git files (git status)
|
||
`Buffers` | Open buffers
|
||
`Colors` | Color schemes
|
||
`Ag [PATTERN]` | {ag}{5} search result (ALT-A to select all, ALT-D to deselect all)
|
||
`Lines` | Lines in loaded buffers
|
||
`BLines` | Lines in the current buffer
|
||
`Tags [QUERY]` | Tags in the project ( `ctags -R` )
|
||
`BTags [QUERY]` | Tags in the current buffer
|
||
`Marks` | Marks
|
||
`Windows` | Windows
|
||
`Locate PATTERN` | `locate` command output
|
||
`History` | `v:oldfiles` and open buffers
|
||
`History:` | Command history
|
||
`History/` | Search history
|
||
`Snippets` | Snippets ({UltiSnips}{6})
|
||
`Commits` | Git commits (requires {fugitive.vim}{7})
|
||
`BCommits` | Git commits for the current buffer
|
||
`Commands` | Commands
|
||
`Maps` | Normal mode mappings
|
||
`Helptags` | Help tags [1]
|
||
`Filetypes` | File types
|
||
-----------------+-------------------------------------------------------------------
|
||
|
||
- Most commands support CTRL-T / CTRL-X / CTRL-V key bindings to open in a new
|
||
tab, a new split, or in a new vertical split
|
||
- Bang-versions of the commands (e.g. `Ag!`) will open fzf in fullscreen
|
||
- You can set `g:fzf_command_prefix` to give the same prefix to the commands
|
||
- e.g. `let g:fzf_command_prefix = 'Fzf'` and you have `FzfFiles`, etc.
|
||
|
||
(1: `Helptags` will shadow the command of the same name from {pathogen}{8}.
|
||
But its functionality is still available via `call pathogen#helptags()`.)
|
||
|
||
{5} https://github.com/ggreer/the_silver_searcher
|
||
{6} https://github.com/SirVer/ultisnips
|
||
{7} https://github.com/tpope/vim-fugitive
|
||
{8} https://github.com/tpope/vim-pathogen
|
||
|
||
|
||
< Customization >_____________________________________________________________~
|
||
*fzf-vim-customization*
|
||
|
||
*g:fzf_action* *g:fzf_layout* *g:fzf_colors* *g:fzf_commits_log_options*
|
||
|
||
Global options~
|
||
>
|
||
" This is the default extra key bindings
|
||
let g:fzf_action = {
|
||
\ 'ctrl-t': 'tab split',
|
||
\ 'ctrl-x': 'split',
|
||
\ 'ctrl-v': 'vsplit' }
|
||
|
||
" Default fzf layout
|
||
" - down / up / left / right
|
||
" - window (nvim only)
|
||
let g:fzf_layout = { 'down': '~40%' }
|
||
|
||
" Customize fzf colors to match your color scheme
|
||
let g:fzf_colors =
|
||
\ { 'fg': ['fg', 'Normal'],
|
||
\ 'bg': ['bg', 'Normal'],
|
||
\ 'hl': ['fg', 'Comment'],
|
||
\ 'fg+': ['fg', 'CursorLine', 'CursorColumn', 'Normal'],
|
||
\ 'bg+': ['bg', 'CursorLine', 'CursorColumn'],
|
||
\ 'hl+': ['fg', 'Statement'],
|
||
\ 'info': ['fg', 'PreProc'],
|
||
\ 'prompt': ['fg', 'Conditional'],
|
||
\ 'pointer': ['fg', 'Exception'],
|
||
\ 'marker': ['fg', 'Keyword'],
|
||
\ 'spinner': ['fg', 'Label'],
|
||
\ 'header': ['fg', 'Comment'] }
|
||
<
|
||
|
||
Command-local options~
|
||
|
||
>
|
||
" [Buffers] Jump to the existing window if possible
|
||
let g:fzf_buffers_jump = 1
|
||
|
||
" [[B]Commits] to customize the options used by 'git log':
|
||
let g:fzf_commits_log_options = \
|
||
'--graph --color=always --format="%C(auto)%h%d %s %C(black)%C(bold)%cr"'
|
||
<
|
||
|
||
Advanced customization using autoload functions~
|
||
|
||
You can use autoload functions to define your own commands.
|
||
>
|
||
" Advanced customization using autoload functions
|
||
autocmd VimEnter * command! Colors
|
||
\ call fzf#vim#colors({'left': '15%', 'options': '--reverse --margin 30%,0'})
|
||
<
|
||
|
||
|
||
MAPPINGS *fzf-vim-mappings*
|
||
==============================================================================
|
||
|
||
---------------------------------+------------------------------------------
|
||
Mapping | Description ~
|
||
---------------------------------+------------------------------------------
|
||
<plug>(fzf-maps-n) | Normal mode mappings
|
||
<plug>(fzf-maps-i) | Insert mode mappings
|
||
<plug>(fzf-maps-x) | Visual mode mappings
|
||
<plug>(fzf-maps-o) | Operator-pending mappings
|
||
<plug>(fzf-complete-word) | `cat /usr/share/dict/words`
|
||
<plug>(fzf-complete-path) | Path completion using `find` (file + dir)
|
||
<plug>(fzf-complete-file) | File completion using `find`
|
||
<plug>(fzf-complete-file-ag) | File completion using `ag`
|
||
<plug>(fzf-complete-line) | Line completion (all open buffers)
|
||
<plug>(fzf-complete-buffer-line) | Line completion (current buffer only)
|
||
---------------------------------+------------------------------------------
|
||
|
||
|
||
< Usage >_____________________________________________________________________~
|
||
*fzf-vim-usage*
|
||
>
|
||
" Mapping selecting mappings
|
||
nmap <leader><tab> <plug>(fzf-maps-n)
|
||
xmap <leader><tab> <plug>(fzf-maps-x)
|
||
omap <leader><tab> <plug>(fzf-maps-o)
|
||
|
||
" Insert mode completion
|
||
imap <c-x><c-k> <plug>(fzf-complete-word)
|
||
imap <c-x><c-f> <plug>(fzf-complete-path)
|
||
imap <c-x><c-j> <plug>(fzf-complete-file-ag)
|
||
imap <c-x><c-l> <plug>(fzf-complete-line)
|
||
|
||
" Advanced customization using autoload functions
|
||
inoremap <expr> <c-x><c-k> fzf#vim#complete#word({'left': '15%'})
|
||
<
|
||
|
||
< Completion helper >_________________________________________________________~
|
||
*fzf-vim-completion-helper*
|
||
|
||
`fzf#complete` is a helper function for creating custom fuzzy completion using
|
||
fzf. If the first parameter is a command string or a Vim list, it will be used
|
||
as the source.
|
||
>
|
||
" Replace the default dictionary completion with fzf-based fuzzy completion
|
||
inoremap <expr> <c-x><c-k> fzf#complete('cat /usr/share/dict/words')
|
||
<
|
||
For advanced uses, you can pass an options dictionary to the function. The set
|
||
of options is pretty much identical to that for `fzf#run` only with the
|
||
following exceptions:
|
||
|
||
- `reducer` (funcref)
|
||
- Reducer transforms the output lines of fzf into a single string value
|
||
- `prefix` (string or funcref; default: `\k*$`)
|
||
- Regular expression pattern to extract the completion prefix
|
||
- Or a function to extract completion prefix
|
||
- Both `source` and `options` can be given as funcrefs that take the completion
|
||
prefix as the argument and return the final value
|
||
- `sink` or `sink*` are not allowed
|
||
|
||
|
||
Reducer example~
|
||
*fzf-vim-reducer-example*
|
||
>
|
||
function! s:make_sentence(lines)
|
||
return substitute(join(a:lines), '^.', '\=toupper(submatch(0))', '').'.'
|
||
endfunction
|
||
|
||
inoremap <expr> <c-x><c-s> fzf#complete({
|
||
\ 'source': 'cat /usr/share/dict/words',
|
||
\ 'reducer': function('<sid>make_sentence'),
|
||
\ 'options': '--multi --reverse --margin 15%,0',
|
||
\ 'left': 20})
|
||
<
|
||
|
||
LICENSE *fzf-vim-license*
|
||
==============================================================================
|
||
|
||
MIT
|
||
|
||
|
||
==============================================================================
|
||
vim:tw=78:sw=2:ts=2:ft=help:norl:nowrap:
|