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-01-14 07:51:52 +00:00
|
|
|
The script will setup:
|
2013-11-19 16:29:36 +00:00
|
|
|
|
2014-01-14 07:51:52 +00:00
|
|
|
- `fzf` executable
|
2014-03-13 06:28:01 +00:00
|
|
|
- Key bindings (`CTRL-T`, `CTRL-R`, and `ALT-C`) for bash and zsh
|
2014-01-14 07:51:52 +00:00
|
|
|
- Fuzzy auto-completion for bash
|
2013-10-23 01:26:55 +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-01-22 03:03:17 +00:00
|
|
|
Options
|
|
|
|
-m, --multi Enable multi-select
|
|
|
|
-x, --extended Extended-search mode
|
2014-03-04 12:29:45 +00:00
|
|
|
-e, --extended-exact Extended-search mode (exact match)
|
2014-01-22 03:03:17 +00:00
|
|
|
-q, --query=STR Initial query
|
2014-02-01 16:45:44 +00:00
|
|
|
-f, --filter=STR Filter mode. Do not start interactive finder.
|
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.
|
|
|
|
-i Case-insensitive match (default: smart-case match)
|
|
|
|
+i Case-sensitive match
|
|
|
|
+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-03-06 11:52:38 +00:00
|
|
|
--no-mouse Disable mouse
|
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
|
|
|
|
# vimf - Open selected file in Vim
|
2013-10-24 15:40:04 +00:00
|
|
|
vimf() {
|
2014-03-14 08:46:55 +00:00
|
|
|
local file
|
2014-03-19 12:57:03 +00:00
|
|
|
file=$(fzf --query="$1") && 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() {
|
2013-10-25 09:31:16 +00:00
|
|
|
eval $(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
|
|
|
|
commits=$(git log --pretty=oneline --abbrev-commit) &&
|
|
|
|
commit=$(echo "$commits" | fzf +s +m -e) &&
|
|
|
|
git checkout $(echo "$commit" | sed "s/ .*//")
|
|
|
|
}
|
2014-03-19 16:57:57 +00:00
|
|
|
|
|
|
|
# fq1 [QUERY]
|
|
|
|
# - Immediately select the file when there's only one match.
|
|
|
|
# If not, start the fuzzy finder as usual.
|
|
|
|
fq1() {
|
|
|
|
local lines
|
|
|
|
lines=$(fzf --filter="$1" --no-sort)
|
|
|
|
if [ -z "$lines" ]; then
|
|
|
|
return 1
|
|
|
|
elif [ $(wc -l <<< "$lines") -eq 1 ]; then
|
|
|
|
echo "$lines"
|
|
|
|
else
|
|
|
|
echo "$lines" | fzf --query="$1"
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
|
|
# fe [QUERY]
|
|
|
|
# - Open the selected file with the default editor
|
|
|
|
# (Bypass fuzzy finder when there's only one match)
|
|
|
|
fe() {
|
|
|
|
local file
|
|
|
|
file=$(fq1 "$1") && ${EDITOR:-vim} "$file"
|
|
|
|
}
|
2013-11-26 16:00:23 +00:00
|
|
|
```
|
2013-10-24 09:56:33 +00:00
|
|
|
|
2013-12-21 15:22:23 +00:00
|
|
|
Key bindings for command line
|
|
|
|
-----------------------------
|
2013-12-21 15:18:41 +00:00
|
|
|
|
2014-01-14 07:51:52 +00:00
|
|
|
The install script will setup the following key bindings.
|
2013-12-21 15:18:41 +00:00
|
|
|
|
2014-03-13 05:29:27 +00:00
|
|
|
### bash/zsh
|
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-13 05:29:27 +00:00
|
|
|
The source code can be found in `~/.fzf.bash` and in `~/.fzf.zsh`.
|
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
|
|
|
|
-------------------
|
|
|
|
|
|
|
|
If you install fzf as a Vim plugin, `:FZF` command will be added.
|
|
|
|
|
|
|
|
```vim
|
|
|
|
" Look for files under current directory
|
|
|
|
:FZF
|
|
|
|
|
|
|
|
" Look for files under your home directory
|
|
|
|
:FZF ~
|
|
|
|
|
|
|
|
" With options
|
|
|
|
:FZF --no-sort -m /tmp
|
|
|
|
```
|
|
|
|
|
|
|
|
You can override the source command which produces input to fzf.
|
|
|
|
|
|
|
|
```vim
|
|
|
|
let g:fzf_source = 'find . -type f'
|
|
|
|
```
|
|
|
|
|
|
|
|
And you can predefine default options to fzf command.
|
|
|
|
|
|
|
|
```vim
|
|
|
|
let g:fzf_options = '--no-color --extended'
|
|
|
|
```
|
|
|
|
|
|
|
|
For more advanced uses, you can call `fzf#run` function as follows.
|
|
|
|
|
|
|
|
```vim
|
|
|
|
:call fzf#run('tabedit', '-m +c')
|
|
|
|
```
|
|
|
|
|
|
|
|
Most of the time, you will prefer native Vim plugins with better integration
|
|
|
|
with Vim. The only reason one might consider using fzf in Vim is its speed. For
|
|
|
|
a very large list of files, fzf is significantly faster and it does not block.
|
|
|
|
|
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
|
|
|
```
|
|
|
|
|
2013-10-23 01:26:55 +00:00
|
|
|
License
|
|
|
|
-------
|
|
|
|
|
|
|
|
MIT
|
|
|
|
|
|
|
|
Author
|
|
|
|
------
|
|
|
|
|
|
|
|
Junegunn Choi
|
|
|
|
|