2013-10-24 03:25:19 +00:00
|
|
|
fzf - Fuzzy finder for your shell
|
|
|
|
=================================
|
2013-10-23 01:26:55 +00:00
|
|
|
|
|
|
|
fzf is a general-purpose fuzzy finder for your shell.
|
|
|
|
|
2013-10-29 13:14:11 +00:00
|
|
|
![](https://raw.github.com/junegunn/i/master/fzf.gif)
|
2013-10-28 06:50:46 +00:00
|
|
|
|
2013-10-24 03:25:19 +00:00
|
|
|
It was heavily inspired by [ctrlp.vim](https://github.com/kien/ctrlp.vim) and
|
|
|
|
the likes.
|
2013-10-23 01:26:55 +00:00
|
|
|
|
|
|
|
Requirements
|
|
|
|
------------
|
|
|
|
|
2013-12-25 16:15:46 +00:00
|
|
|
fzf requires Ruby (>= 1.8.5).
|
|
|
|
|
2013-10-23 01:26:55 +00:00
|
|
|
Installation
|
|
|
|
------------
|
|
|
|
|
2013-11-19 16:29:36 +00:00
|
|
|
Clone this repository and run
|
2013-10-23 01:26:55 +00:00
|
|
|
[install](https://github.com/junegunn/fzf/blob/master/install) script.
|
|
|
|
|
|
|
|
```sh
|
2013-11-19 16:29:36 +00:00
|
|
|
git clone https://github.com/junegunn/fzf.git ~/.fzf
|
|
|
|
~/.fzf/install
|
2013-10-23 01:26:55 +00:00
|
|
|
```
|
|
|
|
|
2014-04-25 10:16:33 +00:00
|
|
|
In case you don't have git installed:
|
|
|
|
|
|
|
|
```sh
|
|
|
|
mkdir -p ~/.fzf
|
2014-04-25 10:45:07 +00:00
|
|
|
curl -L https://github.com/junegunn/fzf/archive/master.tar.gz |
|
2014-04-25 10:16:33 +00:00
|
|
|
tar xz --strip-components 1 -C ~/.fzf
|
|
|
|
~/.fzf/install
|
|
|
|
```
|
|
|
|
|
2014-01-14 07:51:52 +00:00
|
|
|
The script will setup:
|
2013-11-19 16:29:36 +00:00
|
|
|
|
2014-05-02 02:27:32 +00:00
|
|
|
- `fzf` function (bash, zsh, fish)
|
|
|
|
- Key bindings (`CTRL-T`, `CTRL-R`, and `ALT-C`) (bash, zsh, fish)
|
|
|
|
- Fuzzy auto-completion (bash)
|
2013-10-23 01:26:55 +00:00
|
|
|
|
2014-05-02 02:27:32 +00:00
|
|
|
If you don't use any of the aforementioned shells, you have to manually place
|
|
|
|
fzf executable in a directory included in `$PATH`. Key bindings and
|
|
|
|
auto-completion will not be available in that case.
|
2014-03-31 01:15:38 +00:00
|
|
|
|
2013-10-31 16:12:46 +00:00
|
|
|
### Install as Vim plugin
|
2013-10-23 01:26:55 +00:00
|
|
|
|
2014-03-04 02:25:50 +00:00
|
|
|
Once you have cloned the repository, add the following line to your .vimrc.
|
2013-10-23 01:26:55 +00:00
|
|
|
|
2014-03-04 02:25:50 +00:00
|
|
|
```vim
|
|
|
|
set rtp+=~/.fzf
|
|
|
|
```
|
2013-10-23 01:26:55 +00:00
|
|
|
|
2014-03-04 02:25:50 +00:00
|
|
|
Or you may use any Vim plugin manager, such as
|
|
|
|
[vim-plug](https://github.com/junegunn/vim-plug).
|
2013-10-23 01:26:55 +00:00
|
|
|
|
|
|
|
Usage
|
|
|
|
-----
|
|
|
|
|
2013-10-25 09:31:16 +00:00
|
|
|
```
|
|
|
|
usage: fzf [options]
|
|
|
|
|
2014-04-02 12:41:57 +00:00
|
|
|
Search
|
2014-01-22 03:03:17 +00:00
|
|
|
-x, --extended Extended-search mode
|
2014-03-04 12:29:45 +00:00
|
|
|
-e, --extended-exact Extended-search mode (exact match)
|
2014-04-02 12:41:57 +00:00
|
|
|
-i Case-insensitive match (default: smart-case match)
|
|
|
|
+i Case-sensitive match
|
2014-04-01 16:49:07 +00:00
|
|
|
-n, --nth=[-]N[,..] Comma-separated list of field indexes for limiting
|
|
|
|
search scope (positive or negative integers)
|
2014-03-29 08:05:35 +00:00
|
|
|
-d, --delimiter=STR Field delimiter regex for --nth (default: AWK-style)
|
2014-04-02 12:41:57 +00:00
|
|
|
|
|
|
|
Search result
|
2014-01-22 03:03:17 +00:00
|
|
|
-s, --sort=MAX Maximum number of matched items to sort (default: 1000)
|
|
|
|
+s, --no-sort Do not sort the result. Keep the sequence unchanged.
|
2014-04-02 12:41:57 +00:00
|
|
|
|
|
|
|
Interface
|
|
|
|
-m, --multi Enable multi-select with tab/shift-tab
|
|
|
|
--no-mouse Disable mouse
|
2014-01-22 03:03:17 +00:00
|
|
|
+c, --no-color Disable colors
|
2014-03-07 08:32:14 +00:00
|
|
|
+2, --no-256 Disable 256-color
|
2014-03-08 19:06:12 +00:00
|
|
|
--black Use black background
|
2014-05-17 13:07:18 +00:00
|
|
|
--reverse Reverse orientation
|
2014-04-02 12:41:57 +00:00
|
|
|
|
|
|
|
Scripting
|
|
|
|
-q, --query=STR Start the finder with the given query
|
2014-04-02 16:06:40 +00:00
|
|
|
-1, --select-1 Automatically select the only match
|
|
|
|
-0, --exit-0 Exit immediately when there's no match
|
2014-04-02 12:41:57 +00:00
|
|
|
-f, --filter=STR Filter mode. Do not start interactive finder.
|
2014-01-22 03:03:17 +00:00
|
|
|
|
|
|
|
Environment variables
|
|
|
|
FZF_DEFAULT_COMMAND Default command to use when input is tty
|
|
|
|
FZF_DEFAULT_OPTS Defaults options. (e.g. "-x -m --sort 10000")
|
2013-10-25 09:31:16 +00:00
|
|
|
```
|
|
|
|
|
2013-10-23 01:26:55 +00:00
|
|
|
fzf will launch curses-based finder, read the list from STDIN, and write the
|
|
|
|
selected item to STDOUT.
|
|
|
|
|
|
|
|
```sh
|
|
|
|
find * -type f | fzf > selected
|
|
|
|
```
|
|
|
|
|
|
|
|
Without STDIN pipe, fzf will use find command to fetch the list of
|
2013-11-02 03:56:43 +00:00
|
|
|
files excluding hidden ones. (You can override the default command with
|
|
|
|
`FZF_DEFAULT_COMMAND`)
|
2013-10-23 01:26:55 +00:00
|
|
|
|
|
|
|
```sh
|
2013-11-06 11:54:02 +00:00
|
|
|
vim $(fzf)
|
2013-10-23 01:26:55 +00:00
|
|
|
```
|
|
|
|
|
2013-10-25 09:31:16 +00:00
|
|
|
If you want to preserve the exact sequence of the input, provide `--no-sort` (or
|
|
|
|
`+s`) option.
|
2013-10-24 09:56:33 +00:00
|
|
|
|
|
|
|
```sh
|
2013-10-25 09:31:16 +00:00
|
|
|
history | fzf +s
|
2013-10-24 09:56:33 +00:00
|
|
|
```
|
|
|
|
|
2014-03-15 07:54:25 +00:00
|
|
|
### Keys
|
2013-10-23 01:26:55 +00:00
|
|
|
|
|
|
|
Use CTRL-J and CTRL-K (or CTRL-N and CTRL-P) to change the selection, press
|
2013-11-20 12:18:51 +00:00
|
|
|
enter key to select the item. CTRL-C, CTRL-G, or ESC will terminate the finder.
|
2013-10-23 01:26:55 +00:00
|
|
|
|
|
|
|
The following readline key bindings should also work as expected.
|
|
|
|
|
|
|
|
- CTRL-A / CTRL-E
|
|
|
|
- CTRL-B / CTRL-F
|
2014-03-15 07:54:25 +00:00
|
|
|
- CTRL-W / CTRL-U / CTRL-Y
|
2013-11-16 16:19:16 +00:00
|
|
|
- ALT-B / ALT-F
|
2013-10-23 01:26:55 +00:00
|
|
|
|
2013-11-09 18:56:18 +00:00
|
|
|
If you enable multi-select mode with `-m` option, you can select multiple items
|
2013-11-10 11:19:57 +00:00
|
|
|
with TAB or Shift-TAB key.
|
2013-11-09 18:56:18 +00:00
|
|
|
|
2014-03-07 08:30:44 +00:00
|
|
|
You can also use mouse. Double-click on an item to select it or shift-click (or
|
|
|
|
ctrl-click) to select multiple items. Use mouse wheel to move the cursor up and
|
|
|
|
down.
|
2014-03-06 11:52:38 +00:00
|
|
|
|
2013-11-15 17:21:39 +00:00
|
|
|
### Extended-search mode
|
2013-11-15 11:40:57 +00:00
|
|
|
|
2013-11-15 17:21:39 +00:00
|
|
|
With `-x` or `--extended` option, fzf will start in "extended-search mode".
|
2013-11-15 11:40:57 +00:00
|
|
|
|
2013-11-15 17:21:39 +00:00
|
|
|
In this mode, you can specify multiple patterns delimited by spaces,
|
|
|
|
such as: `^music .mp3$ sbtrkt !rmx`
|
2013-11-15 11:40:57 +00:00
|
|
|
|
2013-11-15 16:55:33 +00:00
|
|
|
| Token | Description | Match type |
|
|
|
|
| -------- | -------------------------------- | -------------------- |
|
|
|
|
| `^music` | Items that start with `music` | prefix-exact-match |
|
|
|
|
| `.mp3$` | Items that end with `.mp3` | suffix-exact-match |
|
|
|
|
| `sbtrkt` | Items that match `sbtrkt` | fuzzy-match |
|
|
|
|
| `!rmx` | Items that do not match `rmx` | inverse-fuzzy-match |
|
|
|
|
| `'wild` | Items that include `wild` | exact-match (quoted) |
|
|
|
|
| `!'fire` | Items that do not include `fire` | inverse-exact-match |
|
2013-11-15 11:40:57 +00:00
|
|
|
|
2014-03-04 12:29:45 +00:00
|
|
|
If you don't need fuzzy matching and do not wish to "quote" every word, start
|
|
|
|
fzf with `-e` or `--extended-exact` option.
|
|
|
|
|
2013-12-21 15:18:41 +00:00
|
|
|
Useful examples
|
|
|
|
---------------
|
2013-10-23 01:26:55 +00:00
|
|
|
|
|
|
|
```sh
|
2014-04-02 12:41:57 +00:00
|
|
|
# fe [FUZZY PATTERN] - Open the selected file with the default editor
|
|
|
|
# - Bypass fuzzy finder if there's only one match (--select-1)
|
|
|
|
# - Exit if there's no match (--exit-0)
|
|
|
|
fe() {
|
2014-03-14 08:46:55 +00:00
|
|
|
local file
|
2014-04-02 16:20:22 +00:00
|
|
|
file=$(fzf --query="$1" --select-1 --exit-0)
|
|
|
|
[ -n "$file" ] && ${EDITOR:-vim} "$file"
|
2013-10-24 15:40:04 +00:00
|
|
|
}
|
2013-10-23 01:26:55 +00:00
|
|
|
|
|
|
|
# fd - cd to selected directory
|
|
|
|
fd() {
|
2014-03-14 08:46:55 +00:00
|
|
|
local dir
|
2014-03-14 08:53:23 +00:00
|
|
|
dir=$(find ${1:-*} -path '*/\.*' -prune \
|
|
|
|
-o -type d -print 2> /dev/null | fzf +m) &&
|
|
|
|
cd "$dir"
|
2013-10-23 01:26:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
# fda - including hidden directories
|
|
|
|
fda() {
|
2014-03-14 08:46:55 +00:00
|
|
|
local dir
|
2014-03-14 08:53:23 +00:00
|
|
|
dir=$(find ${1:-.} -type d 2> /dev/null | fzf +m) && cd "$dir"
|
2013-10-23 01:26:55 +00:00
|
|
|
}
|
|
|
|
|
2013-10-24 09:56:33 +00:00
|
|
|
# fh - repeat history
|
|
|
|
fh() {
|
2014-04-04 01:21:35 +00:00
|
|
|
eval $(([ -n "$ZSH_NAME" ] && fc -l 1 || history) | fzf +s | sed 's/ *[0-9]* *//')
|
2013-10-24 09:56:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
# fkill - kill process
|
|
|
|
fkill() {
|
2013-11-09 19:00:27 +00:00
|
|
|
ps -ef | sed 1d | fzf -m | awk '{print $2}' | xargs kill -${1:-9}
|
2013-10-24 09:56:33 +00:00
|
|
|
}
|
2014-03-14 08:46:55 +00:00
|
|
|
|
|
|
|
# fbr - checkout git branch
|
|
|
|
fbr() {
|
|
|
|
local branches branch
|
|
|
|
branches=$(git branch) &&
|
|
|
|
branch=$(echo "$branches" | fzf +s +m) &&
|
|
|
|
git checkout $(echo "$branch" | sed "s/.* //")
|
|
|
|
}
|
|
|
|
|
2014-03-19 23:07:47 +00:00
|
|
|
# fco - checkout git commit
|
2014-03-14 08:46:55 +00:00
|
|
|
fco() {
|
|
|
|
local commits commit
|
2014-03-20 01:38:53 +00:00
|
|
|
commits=$(git log --pretty=oneline --abbrev-commit --reverse) &&
|
2014-03-14 08:46:55 +00:00
|
|
|
commit=$(echo "$commits" | fzf +s +m -e) &&
|
|
|
|
git checkout $(echo "$commit" | sed "s/ .*//")
|
|
|
|
}
|
2014-03-19 16:57:57 +00:00
|
|
|
|
2014-03-29 08:05:35 +00:00
|
|
|
# ftags - search ctags
|
|
|
|
ftags() {
|
|
|
|
local line
|
|
|
|
[ -e tags ] &&
|
2014-04-01 16:49:07 +00:00
|
|
|
line=$(
|
|
|
|
awk 'BEGIN { FS="\t" } !/^!/ {print toupper($4)"\t"$1"\t"$2"\t"$3}' tags |
|
|
|
|
cut -c1-80 | fzf --nth=1,2
|
|
|
|
) && $EDITOR $(cut -f3 <<< "$line") -c "set nocst" \
|
|
|
|
-c "silent tag $(cut -f2 <<< "$line")"
|
2014-03-29 08:05:35 +00:00
|
|
|
}
|
2013-11-26 16:00:23 +00:00
|
|
|
```
|
2013-10-24 09:56:33 +00:00
|
|
|
|
2014-05-02 14:38:36 +00:00
|
|
|
For more examples, see [the wiki
|
|
|
|
page](https://github.com/junegunn/fzf/wiki/examples).
|
|
|
|
|
2013-12-21 15:22:23 +00:00
|
|
|
Key bindings for command line
|
|
|
|
-----------------------------
|
2013-12-21 15:18:41 +00:00
|
|
|
|
2014-05-04 03:52:33 +00:00
|
|
|
The install script will setup the following key bindings for bash, zsh, and
|
|
|
|
fish.
|
2013-12-21 15:18:41 +00:00
|
|
|
|
|
|
|
- `CTRL-T` - Paste the selected file path(s) into the command line
|
|
|
|
- `CTRL-R` - Paste the selected command from history into the command line
|
|
|
|
- `ALT-C` - cd into the selected directory
|
2013-11-08 16:16:39 +00:00
|
|
|
|
2014-03-27 16:39:20 +00:00
|
|
|
If you're on a tmux session, `CTRL-T` will launch fzf in a new split-window. You
|
|
|
|
may disable this tmux integration by setting `FZF_TMUX` to 0, or change the
|
2014-03-28 08:15:32 +00:00
|
|
|
height of the window with `FZF_TMUX_HEIGHT` (e.g. `20`, `50%`).
|
2014-03-27 16:39:20 +00:00
|
|
|
|
2014-05-04 03:52:33 +00:00
|
|
|
If you use vi mode on bash, you need to add `set -o vi` *before* `source
|
|
|
|
~/.fzf.bash` in your .bashrc, so that it correctly sets up key bindings for vi
|
|
|
|
mode.
|
|
|
|
|
2014-05-06 06:39:44 +00:00
|
|
|
If you want to customize the key bindings, consider editing the
|
|
|
|
installer-generated source code: `~/.fzf.bash`, `~/.fzf.zsh`, and
|
2014-05-04 03:56:43 +00:00
|
|
|
`~/.config/fish/functions/fzf_key_bindings.fish`.
|
2013-11-08 16:16:39 +00:00
|
|
|
|
2013-12-14 13:29:57 +00:00
|
|
|
Auto-completion
|
|
|
|
---------------
|
2013-11-19 16:29:36 +00:00
|
|
|
|
|
|
|
Disclaimer: *Auto-completion feature is currently experimental, it can change
|
|
|
|
over time*
|
|
|
|
|
|
|
|
### bash
|
|
|
|
|
2013-11-29 09:08:22 +00:00
|
|
|
#### Files and directories
|
|
|
|
|
2013-11-29 08:49:48 +00:00
|
|
|
Fuzzy completion for files and directories can be triggered if the word before
|
|
|
|
the cursor ends with the trigger sequence which is by default `**`.
|
2013-11-23 11:09:56 +00:00
|
|
|
|
|
|
|
- `COMMAND [DIRECTORY/][FUZZY_PATTERN]**<TAB>`
|
2013-11-19 16:29:36 +00:00
|
|
|
|
|
|
|
```sh
|
2013-11-19 16:42:57 +00:00
|
|
|
# Files under current directory
|
|
|
|
# - You can select multiple items with TAB key
|
2013-11-19 16:29:36 +00:00
|
|
|
vim **<TAB>
|
2013-11-19 16:42:57 +00:00
|
|
|
|
|
|
|
# Files under parent directory
|
2013-11-23 11:09:56 +00:00
|
|
|
vim ../**<TAB>
|
|
|
|
|
|
|
|
# Files under parent directory that match `fzf`
|
|
|
|
vim ../fzf**<TAB>
|
2013-11-19 16:42:57 +00:00
|
|
|
|
|
|
|
# Files under your home directory
|
2013-11-19 16:29:36 +00:00
|
|
|
vim ~/**<TAB>
|
|
|
|
|
2013-11-19 16:42:57 +00:00
|
|
|
|
|
|
|
# Directories under current directory (single-selection)
|
2013-11-19 16:29:36 +00:00
|
|
|
cd **<TAB>
|
2013-11-19 16:42:57 +00:00
|
|
|
|
2013-11-23 11:09:56 +00:00
|
|
|
# Directories under ~/github that match `fzf`
|
|
|
|
cd ~/github/fzf**<TAB>
|
2013-11-19 16:29:36 +00:00
|
|
|
```
|
|
|
|
|
2013-11-29 09:08:22 +00:00
|
|
|
#### Process IDs
|
|
|
|
|
|
|
|
Fuzzy completion for PIDs is provided for kill command. In this case
|
2013-11-29 08:49:48 +00:00
|
|
|
there is no trigger sequence, just press tab key after kill command.
|
|
|
|
|
|
|
|
```sh
|
|
|
|
# Can select multiple processes with <TAB> or <Shift-TAB> keys
|
|
|
|
kill -9 <TAB>
|
|
|
|
```
|
|
|
|
|
2013-11-29 09:08:22 +00:00
|
|
|
#### Host names
|
|
|
|
|
2013-11-29 09:09:51 +00:00
|
|
|
For ssh and telnet commands, fuzzy completion for host names is provided. The
|
2013-12-23 14:16:07 +00:00
|
|
|
names are extracted from /etc/hosts and ~/.ssh/config.
|
2013-11-29 09:08:22 +00:00
|
|
|
|
|
|
|
```sh
|
2013-12-23 14:16:07 +00:00
|
|
|
ssh **<TAB>
|
|
|
|
telnet **<TAB>
|
2013-11-29 09:08:22 +00:00
|
|
|
```
|
|
|
|
|
2013-11-19 16:42:57 +00:00
|
|
|
#### Settings
|
2013-11-19 16:29:36 +00:00
|
|
|
|
|
|
|
```sh
|
2013-11-19 16:42:57 +00:00
|
|
|
# Use ~~ as the trigger sequence instead of the default **
|
2013-11-19 16:29:36 +00:00
|
|
|
export FZF_COMPLETION_TRIGGER='~~'
|
2013-11-19 16:42:57 +00:00
|
|
|
|
|
|
|
# Options to fzf command
|
|
|
|
export FZF_COMPLETION_OPTS='+c -x'
|
2013-11-19 16:29:36 +00:00
|
|
|
```
|
|
|
|
|
|
|
|
### zsh
|
|
|
|
|
2013-11-19 16:42:57 +00:00
|
|
|
TODO :smiley:
|
|
|
|
|
|
|
|
(Pull requests are appreciated.)
|
2013-11-19 16:29:36 +00:00
|
|
|
|
2014-01-07 08:07:02 +00:00
|
|
|
Usage as Vim plugin
|
|
|
|
-------------------
|
|
|
|
|
2014-03-27 15:58:07 +00:00
|
|
|
(fzf is a command-line utility, naturally it is only accessible in terminal Vim)
|
2014-03-25 10:55:52 +00:00
|
|
|
|
2014-03-27 15:58:07 +00:00
|
|
|
### `:FZF[!]`
|
|
|
|
|
|
|
|
If you have set up fzf for Vim, `:FZF` command will be added.
|
2014-01-07 08:07:02 +00:00
|
|
|
|
|
|
|
```vim
|
|
|
|
" Look for files under current directory
|
|
|
|
:FZF
|
|
|
|
|
|
|
|
" Look for files under your home directory
|
|
|
|
:FZF ~
|
|
|
|
|
|
|
|
" With options
|
|
|
|
:FZF --no-sort -m /tmp
|
|
|
|
```
|
|
|
|
|
2014-03-27 15:58:07 +00:00
|
|
|
Note that the environment variables `FZF_DEFAULT_COMMAND` and `FZF_DEFAULT_OPTS`
|
2014-03-25 10:55:52 +00:00
|
|
|
also apply here.
|
|
|
|
|
2014-03-27 16:39:20 +00:00
|
|
|
If you're on a tmux session, `:FZF` will launch fzf in a new split-window whose
|
2014-03-28 08:15:32 +00:00
|
|
|
height can be adjusted with `g:fzf_tmux_height` (default: '40%'). However, the
|
|
|
|
bang version (`:FZF!`) will always start in fullscreen.
|
2014-03-27 15:58:07 +00:00
|
|
|
|
2014-03-25 10:55:52 +00:00
|
|
|
### `fzf#run([options])`
|
|
|
|
|
|
|
|
For more advanced uses, you can call `fzf#run()` function which returns the list
|
|
|
|
of the selected items.
|
|
|
|
|
|
|
|
`fzf#run()` may take an options-dictionary:
|
|
|
|
|
2014-04-12 10:53:33 +00:00
|
|
|
| Option name | Type | Description |
|
|
|
|
| ------------- | ------------- | ------------------------------------------------------------------ |
|
|
|
|
| `source` | string | External command to generate input to fzf (e.g. `find .`) |
|
|
|
|
| `source` | list | Vim list as input to fzf |
|
|
|
|
| `sink` | string | Vim command to handle the selected item (e.g. `e`, `tabe`) |
|
|
|
|
| `sink` | funcref | Reference to function to process each selected item |
|
|
|
|
| `options` | string | Options to fzf |
|
|
|
|
| `dir` | string | Working directory |
|
|
|
|
| `tmux_width` | number/string | Use tmux vertical split with the given height (e.g. `20`, `50%`) |
|
|
|
|
| `tmux_height` | number/string | Use tmux horizontal split with the given height (e.g. `20`, `50%`) |
|
2014-03-25 10:55:52 +00:00
|
|
|
|
|
|
|
#### Examples
|
|
|
|
|
|
|
|
If `sink` option is not given, `fzf#run` will simply return the list.
|
2014-01-07 08:07:02 +00:00
|
|
|
|
|
|
|
```vim
|
2014-03-25 10:55:52 +00:00
|
|
|
let items = fzf#run({ 'options': '-m +c', 'dir': '~', 'source': 'ls' })
|
2014-01-07 08:07:02 +00:00
|
|
|
```
|
|
|
|
|
2014-03-25 10:55:52 +00:00
|
|
|
But if `sink` is given as a string, the command will be executed for each
|
|
|
|
selected item.
|
2014-01-07 08:07:02 +00:00
|
|
|
|
|
|
|
```vim
|
2014-03-25 10:55:52 +00:00
|
|
|
" Each selected item will be opened in a new tab
|
|
|
|
let items = fzf#run({ 'sink': 'tabe', 'options': '-m +c', 'dir': '~', 'source': 'ls' })
|
2014-01-07 08:07:02 +00:00
|
|
|
```
|
|
|
|
|
2014-03-25 10:55:52 +00:00
|
|
|
We can also use a Vim list as the source as follows:
|
2014-01-07 08:07:02 +00:00
|
|
|
|
|
|
|
```vim
|
2014-03-25 10:55:52 +00:00
|
|
|
" Choose a color scheme with fzf
|
2014-03-27 15:58:07 +00:00
|
|
|
nnoremap <silent> <Leader>C :call fzf#run({
|
2014-03-25 10:55:52 +00:00
|
|
|
\ 'source':
|
|
|
|
\ map(split(globpath(&rtp, "colors/*.vim"), "\n"),
|
|
|
|
\ "substitute(fnamemodify(v:val, ':t'), '\\..\\{-}$', '', '')"),
|
2014-04-12 10:53:33 +00:00
|
|
|
\ 'sink': 'colo',
|
|
|
|
\ 'options': '+m',
|
|
|
|
\ 'tmux_width': 20
|
2014-03-27 15:58:07 +00:00
|
|
|
\ })<CR>
|
2014-01-07 08:07:02 +00:00
|
|
|
```
|
|
|
|
|
2014-03-25 10:55:52 +00:00
|
|
|
`sink` option can be a function reference. The following example creates a
|
|
|
|
handy mapping that selects an open buffer.
|
|
|
|
|
|
|
|
```vim
|
|
|
|
" List of buffers
|
|
|
|
function! g:buflist()
|
|
|
|
redir => ls
|
|
|
|
silent ls
|
|
|
|
redir END
|
|
|
|
return split(ls, '\n')
|
|
|
|
endfunction
|
|
|
|
|
|
|
|
function! g:bufopen(e)
|
|
|
|
execute 'buffer '. matchstr(a:e, '^[ 0-9]*')
|
|
|
|
endfunction
|
|
|
|
|
2014-03-27 15:58:07 +00:00
|
|
|
nnoremap <silent> <Leader><Enter> :call fzf#run({
|
2014-04-12 11:02:04 +00:00
|
|
|
\ 'source': reverse(g:buflist()),
|
|
|
|
\ 'sink': function('g:bufopen'),
|
|
|
|
\ 'options': '+m',
|
|
|
|
\ 'tmux_height': '40%'
|
2014-03-25 10:55:52 +00:00
|
|
|
\ })<CR>
|
|
|
|
```
|
2014-01-07 08:07:02 +00:00
|
|
|
|
2014-04-25 10:16:33 +00:00
|
|
|
### Articles
|
|
|
|
|
|
|
|
- [fzf+vim+tmux](http://junegunn.kr/2014/04/fzf+vim+tmux)
|
|
|
|
|
2013-11-10 10:51:32 +00:00
|
|
|
Tips
|
|
|
|
----
|
|
|
|
|
2014-03-09 01:43:59 +00:00
|
|
|
### Rendering issues
|
|
|
|
|
|
|
|
If you have any rendering issues, check the followings:
|
|
|
|
|
|
|
|
1. Make sure `$TERM` is correctly set. fzf will use 256-color only if it
|
|
|
|
contains `256` (e.g. `xterm-256color`)
|
2014-03-09 02:52:35 +00:00
|
|
|
2. If you're on screen or tmux, `$TERM` should be either `screen` or
|
2014-03-09 01:43:59 +00:00
|
|
|
`screen-256color`
|
|
|
|
3. Some terminal emulators (e.g. mintty) have problem displaying default
|
|
|
|
background color and make some text unable to read. In that case, try `--black`
|
|
|
|
option. And if it solves your problem, I recommend including it in
|
|
|
|
`FZF_DEFAULT_OPTS` for further convenience.
|
|
|
|
4. If you still have problem, try `--no-256` option or even `--no-color`.
|
|
|
|
5. Ruby 1.9 or above is required for correctly displaying unicode characters.
|
2013-11-10 10:51:32 +00:00
|
|
|
|
2013-12-21 15:22:23 +00:00
|
|
|
### Ranking algorithm
|
|
|
|
|
|
|
|
fzf sorts the result first by the length of the matched substring, then by the
|
|
|
|
length of the whole string. However it only does so when the number of matches
|
|
|
|
is less than the limit which is by default 1000, in order to avoid the cost of
|
|
|
|
sorting a large list and limit the response time of the query.
|
|
|
|
|
|
|
|
This limit can be adjusted with `-s` option, or with the environment variable
|
2014-01-22 03:03:17 +00:00
|
|
|
`FZF_DEFAULT_OPTS`.
|
2013-12-21 15:22:23 +00:00
|
|
|
|
|
|
|
```sh
|
2014-01-22 03:03:17 +00:00
|
|
|
export FZF_DEFAULT_OPTS="--sort 20000"
|
2013-12-21 15:22:23 +00:00
|
|
|
```
|
|
|
|
|
2014-04-06 06:25:58 +00:00
|
|
|
### Respecting `.gitignore`, `.hgignore`, and `svn:ignore`
|
|
|
|
|
|
|
|
[ag](https://github.com/ggreer/the_silver_searcher) or
|
|
|
|
[pt](https://github.com/monochromegane/the_platinum_searcher) will do the
|
|
|
|
filtering:
|
|
|
|
|
|
|
|
```sh
|
|
|
|
# Feed the output of ag into fzf
|
|
|
|
ag -l -g "" | fzf
|
|
|
|
|
|
|
|
# Setting ag as the default source for fzf
|
|
|
|
export FZF_DEFAULT_COMMAND='ag -l -g ""'
|
|
|
|
|
|
|
|
# Now fzf (w/o pipe) will use ag instead of find
|
|
|
|
fzf
|
|
|
|
```
|
|
|
|
|
2014-05-02 03:52:06 +00:00
|
|
|
### `git ls-tree` for fast traversal
|
|
|
|
|
|
|
|
If you're running fzf in a large git repository, `git ls-tree` can boost up the
|
|
|
|
speed of the traversal.
|
|
|
|
|
|
|
|
```sh
|
|
|
|
# Copy the original fzf function to __fzf
|
|
|
|
declare -f __fzf > /dev/null ||
|
|
|
|
eval "$(echo "__fzf() {"; declare -f fzf | grep -v '^{' | tail -n +2)"
|
|
|
|
|
|
|
|
# Use git ls-tree when possible
|
|
|
|
fzf() {
|
|
|
|
if [ -n "$(git rev-parse HEAD 2> /dev/null)" ]; then
|
|
|
|
FZF_DEFAULT_COMMAND="git ls-tree -r --name-only HEAD" __fzf "$@"
|
|
|
|
else
|
|
|
|
__fzf "$@"
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
2014-05-18 02:01:30 +00:00
|
|
|
### Using fzf with tmux splits
|
|
|
|
|
|
|
|
It isn't too hard to write your own fzf-tmux combo like the default
|
|
|
|
CTRL-T key binding. (Or is it?)
|
|
|
|
|
|
|
|
```sh
|
|
|
|
# This is a helper function that splits the current pane to start the given
|
|
|
|
# command ($1) and sends its output back to the original pane with any number of
|
|
|
|
# optional keys (shift; $*).
|
|
|
|
fzf_tmux_helper() {
|
|
|
|
[ -n "$TMUX_PANE" ] || return
|
|
|
|
local cmd=$1
|
|
|
|
shift
|
|
|
|
tmux split-window -p 40 \
|
|
|
|
"bash -c \"\$(tmux send-keys -t $TMUX_PANE \"\$(source ~/.fzf.bash; $cmd)\" $*)\""
|
|
|
|
}
|
|
|
|
|
|
|
|
# This is the function we are going to run in the split pane.
|
|
|
|
# - "find" to list the directories
|
|
|
|
# - "sed" will escape spaces in the paths.
|
|
|
|
# - "paste" will join the selected paths into a single line
|
|
|
|
fzf_tmux_dir() {
|
|
|
|
fzf_tmux_helper \
|
|
|
|
'find * -path "*/\.*" -prune -o -type d -print 2> /dev/null |
|
|
|
|
fzf --multi |
|
|
|
|
sed "s/ /\\\\ /g" |
|
|
|
|
paste -sd" " -' Space
|
|
|
|
}
|
|
|
|
|
|
|
|
# Bind CTRL-X-CTRL-D to fzf_tmux_dir
|
|
|
|
bind '"\C-x\C-d": "$(fzf_tmux_dir)\e\C-e"'
|
|
|
|
```
|
|
|
|
|
2014-05-02 02:27:32 +00:00
|
|
|
### Fish shell
|
|
|
|
|
|
|
|
It's [a known bug of fish](https://github.com/fish-shell/fish-shell/issues/1362)
|
|
|
|
that it doesn't allow reading from STDIN in command substitution, which means
|
|
|
|
simple `vim (fzf)` won't work as expected. The workaround is to store the result
|
|
|
|
of fzf to a temporary file.
|
|
|
|
|
|
|
|
```sh
|
|
|
|
function vimf
|
|
|
|
if fzf > $TMPDIR/fzf.result
|
|
|
|
vim (cat $TMPDIR/fzf.result)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
function fe
|
|
|
|
set tmp $TMPDIR/fzf.result
|
|
|
|
fzf --query="$argv[1]" --select-1 --exit-0 > $tmp
|
|
|
|
if [ (cat $tmp | wc -l) -gt 0 ]
|
|
|
|
vim (cat $tmp)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
```
|
|
|
|
|
2014-04-06 06:25:58 +00:00
|
|
|
### Windows
|
|
|
|
|
|
|
|
fzf works on [Cygwin](http://www.cygwin.com/) and
|
|
|
|
[MSYS2](http://sourceforge.net/projects/msys2/). You may need to use `--black`
|
2014-04-12 10:52:25 +00:00
|
|
|
option on MSYS2 to avoid rendering issues.
|
2014-04-06 06:25:58 +00:00
|
|
|
|
|
|
|
|
2013-10-23 01:26:55 +00:00
|
|
|
License
|
|
|
|
-------
|
|
|
|
|
|
|
|
MIT
|
|
|
|
|
|
|
|
Author
|
|
|
|
------
|
|
|
|
|
|
|
|
Junegunn Choi
|
|
|
|
|