fzf/src
Junegunn Choi fccc93176b
0.13.3
2016-07-16 01:06:53 +09:00
..
algo Apply new ranking algorithm to exact match as well 2016-04-23 19:48:06 +09:00
curses Add --preview and --preview-window 2016-06-11 19:59:12 +09:00
fzf Rewrite fzf in Go 2015-01-04 00:37:29 +09:00
util Add --hscroll-off=COL option 2016-03-02 03:14:35 +09:00
ansi_test.go Do not process ANSI codes in --preview output at once 2016-06-14 21:52:47 +09:00
ansi.go Fix duplicate rendering of the last line in preview window 2016-07-15 23:24:14 +09:00
cache_test.go Improvements in performance and memory usage 2015-04-17 22:23:52 +09:00
cache.go Improvements in performance and memory usage 2015-04-17 22:23:52 +09:00
chunklist_test.go Simplify Item structure 2016-01-14 01:12:49 +09:00
chunklist.go Performance fix - unnecessary rune convertion on --ansi 2015-08-02 14:25:57 +09:00
constants.go 0.13.3 2016-07-16 01:06:53 +09:00
core.go Do not process ANSI codes in --preview output at once 2016-06-14 21:52:47 +09:00
Dockerfile.android Update build script 2016-02-20 21:16:24 +09:00
Dockerfile.arch Update build script 2016-02-20 21:16:24 +09:00
Dockerfile.centos Make 32-bit linux binary (partially) static (#523) 2016-03-15 20:17:29 +09:00
Dockerfile.ubuntu Update build script 2016-02-20 21:16:24 +09:00
history_test.go Fix test code for docker build 2015-06-15 22:45:31 +09:00
history.go Lint 2015-08-02 13:11:59 +09:00
item_test.go Simplify Item structure 2016-01-14 01:12:49 +09:00
item.go Do not process ANSI codes in --preview output at once 2016-06-14 21:52:47 +09:00
LICENSE Update license: 2016 2016-01-13 02:16:26 +09:00
Makefile [make] Reduce the size of the binaries with -ldflags -w 2016-05-18 13:29:27 +09:00
matcher.go Go 1.3 compatibility 2016-02-16 11:28:40 +02:00
merger_test.go Simplify Item structure 2016-01-14 01:12:49 +09:00
merger.go Accept comma-separated list of sort criteria 2016-01-13 21:27:43 +09:00
options_test.go Allow alt-enter and alt-space for --bind (#571) 2016-05-13 00:43:50 +09:00
options.go Add --preview and --preview-window 2016-06-11 19:59:12 +09:00
pattern_test.go Enhanced ranking algorithm 2016-04-16 14:33:38 +09:00
pattern.go Fix incorrect cache reference in --exact mode (#547) 2016-04-24 03:43:24 +09:00
reader_test.go Performance fix - unnecessary rune convertion on --ansi 2015-08-02 14:25:57 +09:00
reader.go Use $SHELL to start $FZF_DEFAULT_COMMAND (#481) 2016-02-07 01:49:29 +09:00
README.md Update Makefile to allow build on i686 (#555) 2016-04-26 01:49:02 +09:00
terminal.go Fix race condition where preview window is not properly cleared 2016-06-15 13:15:17 +09:00
tokenizer_test.go Use trimmed length when --nth is used with --tiebreak=length 2015-10-02 18:40:20 +09:00
tokenizer.go Use trimmed length when --nth is used with --tiebreak=length 2015-10-02 18:40:20 +09:00
update_assets.rb Fix update_assets script 2015-01-23 20:32:56 +09:00

fzf in Go

fzf in go

This directory contains the source code for the new fzf implementation in Go.

Upgrade from Ruby version

The install script has been updated to download the right binary for your system. If you already have installed fzf, simply git-pull the repository and rerun the install script.

cd ~/.fzf
git pull
./install

Otherwise, follow the instruction as before. You can also install fzf using Homebrew if you prefer that way.

Motivations

No Ruby dependency

There have always been complaints about fzf being a Ruby script. To make matters worse, Ruby 2.1 removed ncurses binding from its standard libary. Because of the change, users running Ruby 2.1 or above are forced to build C extensions of curses gem to meet the requirement of fzf. The new Go version will be distributed as an executable binary so it will be much more accessible and should be easier to setup.

Performance

Many people have been surprised to see how fast fzf is even when it was written in Ruby. It stays quite responsive even for 100k+ lines, which is well above the size of the usual input.

The new Go version, of course, is significantly faster than that. It has all the performance optimization techniques used in Ruby implementation and more. It also doesn't suffer from GIL, so the search performance scales proportional to the number of CPU cores. On my MacBook Pro (Mid 2012), the new version was shown to be an order of magnitude faster on certain cases. It also starts much faster though the difference may not be noticeable.

Differences with Ruby version

The Go version is designed to be perfectly compatible with the previous Ruby version. The only behavioral difference is that the new version ignores the numeric argument to --sort=N option and always sorts the result regardless of the number of matches. The value was introduced to limit the response time of the query, but the Go version is blazingly fast (almost instant response even for 1M+ items) so I decided that it's no longer required.

System requirements

Currently, prebuilt binaries are provided only for OS X and Linux. The install script will fall back to the legacy Ruby version on the other systems, but if you have Go 1.4 installed, you can try building it yourself.

However, as pointed out in golang.org/doc/install, the Go version may not run on CentOS/RHEL 5.x, and if that's the case, the install script will choose the Ruby version instead.

The Go version depends on ncurses and some Unix system calls, so it shouldn't run natively on Windows at the moment. But it won't be impossible to support Windows by falling back to a cross-platform alternative such as termbox only on Windows. If you're interested in making fzf work on Windows, please let me know.

Build

# Build fzf executables and tarballs
make release

# Install the executable to ../bin directory
make install

# Build executables and tarballs for Linux using Docker
make linux

Contribution

For the time being, I will not add or accept any new features until we can be sure that the implementation is stable and we have a sufficient number of test cases. However, fixes for obvious bugs and new test cases are welcome.

I also care much about the performance of the implementation, so please make sure that your change does not result in performance regression. And please be noted that we don't have a quantitative measure of the performance yet.

Third-party libraries used

License

MIT