2015-08-22 01:00:31 +09:00
|
|
|
fzf :heart: vim
|
|
|
|
===============
|
2015-08-15 01:26:01 +09:00
|
|
|
|
2015-08-29 22:47:26 +09:00
|
|
|
Things you can do with [fzf][fzf] and Vim.
|
2015-08-15 01:26:01 +09:00
|
|
|
|
|
|
|
Rationale
|
|
|
|
---------
|
|
|
|
|
|
|
|
[fzf][fzf] in itself is not a Vim plugin, and the official repository only
|
|
|
|
provides the [basic wrapper function][run] 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.
|
|
|
|
|
2015-08-22 01:00:31 +09:00
|
|
|
This repository is a bundle of fzf-based commands and mappings extracted from
|
|
|
|
my [.vimrc][vimrc] to address such needs. They are *not* designed to be
|
2015-08-29 22:47:26 +09:00
|
|
|
flexible or configurable, and there's no guarantee of backward-compatibility.
|
2015-08-15 01:26:01 +09:00
|
|
|
|
2015-09-07 00:51:56 +09:00
|
|
|
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.
|
|
|
|
|
2015-08-15 01:26:01 +09:00
|
|
|
Installation
|
|
|
|
------------
|
|
|
|
|
|
|
|
Using [vim-plug](https://github.com/junegunn/vim-plug):
|
|
|
|
|
|
|
|
```vim
|
2015-10-23 14:00:31 +09:00
|
|
|
Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' }
|
2015-08-15 01:26:01 +09:00
|
|
|
Plug 'junegunn/fzf.vim'
|
|
|
|
```
|
|
|
|
|
2016-07-02 19:49:32 +09:00
|
|
|
- `dir` and `do` options are not mandatory
|
2016-04-05 22:31:38 +09:00
|
|
|
- Use `./install --bin` instead if you don't need fzf outside of Vim
|
2016-07-18 16:48:51 +09:00
|
|
|
- If you installed fzf using Homebrew, the following should suffice:
|
2016-07-18 16:49:15 +09:00
|
|
|
- `Plug '/usr/local/opt/fzf' | Plug 'junegunn/fzf.vim'`
|
2016-04-05 22:31:38 +09:00
|
|
|
- Make sure to use Vim 7.4 or above
|
2015-09-20 01:32:22 +09:00
|
|
|
|
2015-08-22 01:00:31 +09:00
|
|
|
Commands
|
|
|
|
--------
|
2015-08-15 01:26:01 +09:00
|
|
|
|
2016-05-25 00:24:12 +09:00
|
|
|
| Command | List |
|
|
|
|
| --- | --- |
|
|
|
|
| `Files [PATH]` | Files (similar to `:FZF`) |
|
2016-06-10 23:03:13 +09:00
|
|
|
| `GFiles [OPTS]` | Git files (`git ls-files`) |
|
|
|
|
| `GFiles?` | Git files (`git status`) |
|
2016-05-25 00:24:12 +09:00
|
|
|
| `Buffers` | Open buffers |
|
|
|
|
| `Colors` | Color schemes |
|
|
|
|
| `Ag [PATTERN]` | [ag][ag] search result (`ALT-A` to select all, `ALT-D` to deselect all) |
|
|
|
|
| `Lines [QUERY]` | Lines in loaded buffers |
|
|
|
|
| `BLines [QUERY]` | 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][us]) |
|
|
|
|
| `Commits` | Git commits (requires [fugitive.vim][f]) |
|
|
|
|
| `BCommits` | Git commits for the current buffer |
|
|
|
|
| `Commands` | Commands |
|
|
|
|
| `Maps` | Normal mode mappings |
|
|
|
|
| `Helptags` | Help tags <sup id="a1">[1](#helptags)</sup> |
|
|
|
|
| `Filetypes` | File types
|
2015-08-15 01:26:01 +09:00
|
|
|
|
2015-08-22 01:00:31 +09:00
|
|
|
- Most commands support `CTRL-T` / `CTRL-X` / `CTRL-V` key
|
2015-09-30 18:42:48 +09:00
|
|
|
bindings to open in a new tab, a new split, or in a new vertical split
|
2015-08-15 01:26:01 +09:00
|
|
|
- Bang-versions of the commands (e.g. `Ag!`) will open fzf in fullscreen
|
2015-09-30 18:42:48 +09:00
|
|
|
- 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.
|
2015-08-15 01:26:01 +09:00
|
|
|
|
2015-09-06 14:52:19 +09:00
|
|
|
(<a name="helptags">1</a>: `Helptags` will shadow the command of the same name
|
|
|
|
from [pathogen][pat]. But its functionality is still available via `call
|
|
|
|
pathogen#helptags()`. [↩](#a1))
|
|
|
|
|
|
|
|
[pat]: https://github.com/tpope/vim-pathogen
|
2015-09-20 01:26:08 +09:00
|
|
|
[f]: https://github.com/tpope/vim-fugitive
|
2015-09-06 14:52:19 +09:00
|
|
|
|
2015-08-18 18:30:08 +09:00
|
|
|
### Customization
|
2015-08-15 01:26:01 +09:00
|
|
|
|
2016-04-09 21:34:38 +09:00
|
|
|
#### Global options
|
|
|
|
|
2015-08-15 01:26:01 +09:00
|
|
|
```vim
|
|
|
|
" This is the default extra key bindings
|
|
|
|
let g:fzf_action = {
|
2015-08-15 02:23:38 +09:00
|
|
|
\ 'ctrl-t': 'tab split',
|
2015-08-15 01:26:01 +09:00
|
|
|
\ 'ctrl-x': 'split',
|
|
|
|
\ 'ctrl-v': 'vsplit' }
|
2015-08-22 00:55:57 +09:00
|
|
|
|
|
|
|
" Default fzf layout
|
2015-10-15 16:00:43 +09:00
|
|
|
" - down / up / left / right
|
|
|
|
let g:fzf_layout = { 'down': '~40%' }
|
2015-09-06 00:58:45 +09:00
|
|
|
|
2016-07-02 20:32:24 +09:00
|
|
|
" In Neovim, you can set up fzf window using a Vim command
|
|
|
|
let g:fzf_layout = { 'window': 'enew' }
|
|
|
|
let g:fzf_layout = { 'window': '-tabnew' }
|
|
|
|
|
2016-04-09 21:34:38 +09:00
|
|
|
" 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'] }
|
2016-07-21 22:14:18 +09:00
|
|
|
|
|
|
|
" Enable per-command history.
|
|
|
|
" CTRL-N and CTRL-P will be automatically bound to next-history and
|
|
|
|
" previous-history instead of down and up. If you don't like the change,
|
|
|
|
" explicitly bind the keys to down and up in your $FZF_DEFAULT_OPTS.
|
2016-10-14 03:08:31 +02:00
|
|
|
let g:fzf_history_dir = '~/.local/share/fzf-history'
|
2016-04-09 21:34:38 +09:00
|
|
|
```
|
|
|
|
|
|
|
|
#### Command-local options
|
|
|
|
|
|
|
|
```vim
|
2016-03-11 01:14:42 +09:00
|
|
|
" [Buffers] Jump to the existing window if possible
|
2016-06-24 00:45:54 +09:00
|
|
|
let g:fzf_buffers_jump = 1
|
2016-03-11 01:14:42 +09:00
|
|
|
|
2016-05-12 01:42:24 +09:00
|
|
|
" [[B]Commits] Customize the options used by 'git log':
|
2016-01-04 15:59:19 -08:00
|
|
|
let g:fzf_commits_log_options = '--graph --color=always --format="%C(auto)%h%d %s %C(black)%C(bold)%cr"'
|
2016-05-12 01:42:24 +09:00
|
|
|
|
|
|
|
" [Tags] Command to generate tags file
|
|
|
|
let g:fzf_tags_command = 'ctags -R'
|
2016-06-21 01:06:56 +09:00
|
|
|
|
|
|
|
" [Commands] --expect expression for directly executing the command
|
2016-06-24 00:45:54 +09:00
|
|
|
let g:fzf_commands_expect = 'alt-enter,ctrl-x'
|
2016-04-09 21:34:38 +09:00
|
|
|
```
|
|
|
|
|
2016-11-26 14:10:16 +09:00
|
|
|
#### Advanced customization
|
2016-01-04 15:59:19 -08:00
|
|
|
|
2016-04-09 21:34:38 +09:00
|
|
|
You can use autoload functions to define your own commands.
|
|
|
|
|
|
|
|
```vim
|
2016-11-26 14:10:16 +09:00
|
|
|
" Command for git grep
|
|
|
|
" - fzf#vim#grep(command, with_column, [options], [fullscreen])
|
2016-09-27 02:01:40 +09:00
|
|
|
command! -bang -nargs=* GGrep
|
|
|
|
\ call fzf#vim#grep('git grep --line-number '.shellescape(<q-args>), 0, <bang>0)
|
|
|
|
|
2017-02-07 11:40:31 +09:00
|
|
|
" Override Colors command. You can safely do this in your .vimrc as fzf.vim
|
|
|
|
" will not override existing commands.
|
|
|
|
command! -bang Colors
|
2016-11-26 14:10:16 +09:00
|
|
|
\ call fzf#vim#colors({'left': '15%', 'options': '--reverse --margin 30%,0'}, <bang>0)
|
|
|
|
|
|
|
|
" Augmenting Ag command using fzf#vim#with_preview function
|
|
|
|
" * fzf#vim#with_preview([[options], preview window, [toggle keys...]])
|
2017-03-18 02:14:34 +09:00
|
|
|
" * For syntax-highlighting, Ruby and any of the following tools are required:
|
|
|
|
" - Highlight: http://www.andre-simon.de/doku/highlight/en/highlight.php
|
|
|
|
" - CodeRay: http://coderay.rubychan.de/
|
|
|
|
" - Rouge: https://github.com/jneen/rouge
|
2016-11-26 14:10:16 +09:00
|
|
|
"
|
|
|
|
" :Ag - Start fzf with hidden preview window that can be enabled with "?" key
|
|
|
|
" :Ag! - Start fzf in fullscreen and display the preview window above
|
2017-02-07 11:40:31 +09:00
|
|
|
command! -bang -nargs=* Ag
|
2016-11-26 14:10:16 +09:00
|
|
|
\ call fzf#vim#ag(<q-args>,
|
|
|
|
\ <bang>0 ? fzf#vim#with_preview('up:60%')
|
|
|
|
\ : fzf#vim#with_preview('right:50%:hidden', '?'),
|
|
|
|
\ <bang>0)
|
|
|
|
|
|
|
|
" Similarly, we can apply it to fzf#vim#grep. To use ripgrep instead of ag:
|
|
|
|
command! -bang -nargs=* Rg
|
|
|
|
\ call fzf#vim#grep(
|
|
|
|
\ 'rg --column --line-number --no-heading --color=always '.shellescape(<q-args>), 1,
|
|
|
|
\ <bang>0 ? fzf#vim#with_preview('up:60%')
|
|
|
|
\ : fzf#vim#with_preview('right:50%:hidden', '?'),
|
|
|
|
\ <bang>0)
|
2017-03-13 19:42:16 +09:00
|
|
|
|
|
|
|
" Likewise, Files command with preview window
|
|
|
|
command! -bang -nargs=? -complete=dir Files
|
|
|
|
\ call fzf#vim#files(<q-args>, fzf#vim#with_preview(), <bang>0)
|
2015-08-15 01:26:01 +09:00
|
|
|
```
|
|
|
|
|
2015-08-22 01:00:31 +09:00
|
|
|
Mappings
|
|
|
|
--------
|
|
|
|
|
2015-08-23 04:23:16 +09:00
|
|
|
| Mapping | Description |
|
|
|
|
| --- | --- |
|
2015-10-02 01:17:01 +09:00
|
|
|
| `<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 |
|
2015-08-23 04:23:16 +09:00
|
|
|
| `<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) |
|
2015-08-22 01:00:31 +09:00
|
|
|
|
|
|
|
### Usage
|
|
|
|
|
|
|
|
```vim
|
2015-10-02 01:17:01 +09:00
|
|
|
" 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
|
2015-08-22 01:00:31 +09:00
|
|
|
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)
|
2015-08-23 04:23:16 +09:00
|
|
|
imap <c-x><c-l> <plug>(fzf-complete-line)
|
2015-09-06 00:58:45 +09:00
|
|
|
|
|
|
|
" Advanced customization using autoload functions
|
|
|
|
inoremap <expr> <c-x><c-k> fzf#vim#complete#word({'left': '15%'})
|
2015-08-22 01:00:31 +09:00
|
|
|
```
|
|
|
|
|
|
|
|
### Completion helper
|
2015-08-18 18:30:08 +09:00
|
|
|
|
|
|
|
`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.
|
|
|
|
|
|
|
|
```vim
|
|
|
|
" 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
|
2015-08-20 03:19:48 +09:00
|
|
|
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
|
2015-09-11 12:01:14 +09:00
|
|
|
- `prefix` (string or funcref; default: `\k*$`)
|
2015-08-20 03:19:48 +09:00
|
|
|
- Regular expression pattern to extract the completion prefix
|
2015-09-11 12:01:14 +09:00
|
|
|
- Or a function to extract completion prefix
|
2015-08-20 03:19:48 +09:00
|
|
|
- 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
|
2015-08-18 18:30:08 +09:00
|
|
|
|
2015-08-22 01:00:25 +09:00
|
|
|
#### Reducer example
|
|
|
|
|
2015-08-18 18:30:08 +09:00
|
|
|
```vim
|
2015-08-22 01:00:25 +09:00
|
|
|
function! s:make_sentence(lines)
|
|
|
|
return substitute(join(a:lines), '^.', '\=toupper(submatch(0))', '').'.'
|
2015-08-18 18:30:08 +09:00
|
|
|
endfunction
|
|
|
|
|
2015-08-22 01:00:25 +09:00
|
|
|
inoremap <expr> <c-x><c-s> fzf#complete({
|
2015-08-18 18:30:08 +09:00
|
|
|
\ 'source': 'cat /usr/share/dict/words',
|
2015-08-22 01:00:25 +09:00
|
|
|
\ 'reducer': function('<sid>make_sentence'),
|
|
|
|
\ 'options': '--multi --reverse --margin 15%,0',
|
2015-08-18 18:30:08 +09:00
|
|
|
\ 'left': 20})
|
|
|
|
```
|
|
|
|
|
2015-10-31 00:33:06 +09:00
|
|
|
Status line (neovim)
|
|
|
|
--------------------
|
|
|
|
|
|
|
|
```vim
|
|
|
|
function! s:fzf_statusline()
|
|
|
|
" Override statusline as you like
|
|
|
|
highlight fzf1 ctermfg=161 ctermbg=251
|
|
|
|
highlight fzf2 ctermfg=23 ctermbg=251
|
|
|
|
highlight fzf3 ctermfg=237 ctermbg=251
|
|
|
|
setlocal statusline=%#fzf1#\ >\ %#fzf2#fz%#fzf3#f
|
|
|
|
endfunction
|
|
|
|
|
|
|
|
autocmd! User FzfStatusLine call <SID>fzf_statusline()
|
|
|
|
```
|
|
|
|
|
2015-08-15 01:26:01 +09:00
|
|
|
License
|
|
|
|
-------
|
|
|
|
|
|
|
|
MIT
|
|
|
|
|
|
|
|
[fzf]: https://github.com/junegunn/fzf
|
|
|
|
[run]: https://github.com/junegunn/fzf#usage-as-vim-plugin
|
|
|
|
[vimrc]: https://github.com/junegunn/dotfiles/blob/master/vimrc
|
|
|
|
[ag]: https://github.com/ggreer/the_silver_searcher
|
2015-08-17 18:54:00 +09:00
|
|
|
[us]: https://github.com/SirVer/ultisnips
|