fzf/README.md

210 lines
4.4 KiB
Markdown
Raw Normal View History

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-10-24 03:25:19 +00:00
fzf requires Ruby (>= 1.8.5).
2013-10-23 01:26:55 +00:00
Installation
------------
2013-11-04 15:11:06 +00:00
Download [fzf executable](https://raw.github.com/junegunn/fzf/master/fzf) and
put it somewhere in your search $PATH.
2013-10-23 01:26:55 +00:00
```sh
mkdir -p ~/bin
wget https://raw.github.com/junegunn/fzf/master/fzf -O ~/bin/fzf
chmod +x ~/bin/fzf
```
Or you can just clone this repository and run
[install](https://github.com/junegunn/fzf/blob/master/install) script.
```sh
git clone https://github.com/junegunn/fzf.git
fzf/install
```
Make sure that ~/bin is included in $PATH.
```sh
export PATH=$PATH:~/bin
```
2013-10-31 16:12:46 +00:00
### Install as Ruby gem
fzf can be installed as a Ruby gem
```
gem install fzf
```
2013-11-02 03:56:43 +00:00
It's a bit easier to install and update the script but the Ruby gem version
takes slightly longer to start.
2013-10-31 16:12:46 +00:00
### Install as Vim plugin
2013-10-23 01:26:55 +00:00
2013-11-02 11:40:25 +00:00
You can use any Vim plugin manager to install fzf for Vim. If you don't use one,
I recommend you try [vim-plug](https://github.com/junegunn/vim-plug).
2013-10-23 01:26:55 +00:00
1. [Install vim-plug](https://github.com/junegunn/vim-plug#usage)
2. Edit your .vimrc
call plug#begin()
Plug 'junegunn/fzf'
" ...
call plug#end()
3. Run `:PlugInstall`
Usage
-----
2013-10-25 09:31:16 +00:00
```
usage: fzf [options]
2013-11-09 18:56:18 +00:00
-m, --multi Enable multi-select
2013-10-25 09:31:16 +00:00
-s, --sort=MAX Maximum number of matched items to sort. Default: 500
+s, --no-sort Keep the sequence unchanged.
+i Case-sensitive match
2013-11-03 02:45:14 +00:00
+c, --no-color Disable colors
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
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.
```sh
2013-10-25 09:31:16 +00:00
history | fzf +s
```
2013-10-23 01:26:55 +00:00
### Key binding
Use CTRL-J and CTRL-K (or CTRL-N and CTRL-P) to change the selection, press
enter key to select the item. CTRL-C will terminate the finder.
The following readline key bindings should also work as expected.
- CTRL-A / CTRL-E
- CTRL-B / CTRL-F
- CTRL-W / CTRL-U
2013-11-09 18:56:18 +00:00
If you enable multi-select mode with `-m` option, you can select multiple items
with TAB key.
Usage as Vim plugin
-------------------
If you install fzf as a Vim plugin, `:FZF` command will be added.
```vim
:FZF
:FZF --no-sort
```
You can override the command which produces input to fzf.
```vim
let g:fzf_command = 'find . -type f'
```
2013-11-02 11:40:25 +00:00
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.
Useful bash 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() {
FILE=$(fzf) && vim "$FILE"
2013-10-24 15:40:04 +00:00
}
2013-10-23 01:26:55 +00:00
# fd - cd to selected directory
fd() {
DIR=$(find ${1:-*} -path '*/\.*' -prune -o -type d -print 2> /dev/null | fzf) && cd "$DIR"
2013-10-23 01:26:55 +00:00
}
# fda - including hidden directories
fda() {
DIR=$(find ${1:-*} -type d 2> /dev/null | fzf) && cd "$DIR"
2013-10-23 01:26:55 +00:00
}
# fh - repeat history
fh() {
2013-10-25 09:31:16 +00:00
eval $(history | fzf +s | sed 's/ *[0-9]* *//')
}
# fkill - kill process
fkill() {
ps -ef | sed 1d | fzf | awk '{print $2}' | xargs kill -${1:-9}
}
2013-11-02 11:40:25 +00:00
# (Assuming you don't use the default CTRL-T and CTRL-R)
2013-11-02 03:56:43 +00:00
# CTRL-T - Paste the selected file path into the command line
2013-10-23 01:26:55 +00:00
bind '"\er": redraw-current-line'
bind '"\C-t": " \C-u \C-a\C-k$(fzf)\e\C-e\C-y\C-a\C-y\ey\C-h\C-e\er"'
2013-11-02 03:56:43 +00:00
# CTRL-R - Paste the selected command from history into the command line
bind '"\C-r": " \C-e\C-u$(history | fzf +s | sed \"s/ *[0-9]* *//\")\e\C-e\er"'
2013-10-23 01:26:55 +00:00
```
2013-11-08 16:16:39 +00:00
zsh widgets
-----------
```sh
# CTRL-T - Paste the selected file path into the command line
fzf-file-widget() {
LBUFFER+=$(
find * -path '*/\\.*' -prune \
-o -type f -print \
-o -type l -print 2> /dev/null | fzf)
zle redisplay
}
zle -N fzf-file-widget
bindkey '^T' fzf-file-widget
# CTRL-R - Paste the selected command from history into the command line
fzf-history-widget() {
LBUFFER+=$(history | fzf +s | sed "s/ *[0-9]* *//")
zle redisplay
}
zle -N fzf-history-widget
bindkey '^R' fzf-history-widget
```
2013-10-23 01:26:55 +00:00
License
-------
MIT
Author
------
Junegunn Choi