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
|
|
|
|
Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': 'yes \| ./install' }
|
|
|
|
Plug 'junegunn/fzf.vim'
|
|
|
|
```
|
|
|
|
|
2015-08-22 01:00:31 +09:00
|
|
|
Commands
|
|
|
|
--------
|
2015-08-15 01:26:01 +09:00
|
|
|
|
2015-08-16 10:12:57 +09:00
|
|
|
| Command | List |
|
|
|
|
| --- | --- |
|
|
|
|
| `Files [PATH]` | Files (similar to `:FZF`) |
|
|
|
|
| `Buffers` | Open buffers |
|
|
|
|
| `Colors` | Color schemes |
|
|
|
|
| `Ag [PATTERN]` | [ag][ag] search result (`CTRL-A` to select all, `CTRL-D` to deselect all) |
|
|
|
|
| `Lines` | Lines in loaded buffers |
|
2015-08-23 04:14:04 +09:00
|
|
|
| `BLines` | Lines in the current buffer |
|
2015-08-16 10:12:57 +09:00
|
|
|
| `Tags` | Tags in the project (`ctags -R`) |
|
|
|
|
| `BTags` | Tags in the current buffer |
|
2015-08-28 17:49:50 +09:00
|
|
|
| `Marks` | Marks |
|
|
|
|
| `Windows` | Windows |
|
2015-08-16 10:12:57 +09:00
|
|
|
| `Locate PATTERN` | `locate` command output |
|
|
|
|
| `History` | `v:oldfiles` and open buffers |
|
2015-09-02 19:14:56 +09:00
|
|
|
| `History:` | Command history |
|
|
|
|
| `History/` | Search history |
|
2015-08-17 18:54:00 +09:00
|
|
|
| `Snippets` | Snippets ([UltiSnips][us]) |
|
2015-08-29 22:51:34 +09:00
|
|
|
| `Commands` | Commands |
|
2015-09-06 14:52:19 +09:00
|
|
|
| `Helptags` | Help tags <sup id="a1">[1](#helptags)</sup> |
|
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-08-15 01:26:01 +09:00
|
|
|
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
|
|
|
|
|
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-08-18 18:30:08 +09:00
|
|
|
### Customization
|
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
|
|
|
|
let g:fzf_layout = { 'down': '40%' }
|
2015-09-06 00:58:45 +09:00
|
|
|
|
|
|
|
" Advanced customization using autoload functions
|
|
|
|
autocmd VimEnter * command! Colors call fzf#vim#colors({'left': '15%'})
|
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 |
|
|
|
|
| --- | --- |
|
|
|
|
| `<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
|
|
|
|
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-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
|