fzf/src
2015-01-11 17:01:30 +09:00
..
curses Remove call to ncurses set_tabsize() 2015-01-08 11:04:25 +09:00
fzf Rewrite fzf in Go 2015-01-04 00:37:29 +09:00
algo_test.go Rewrite fzf in Go 2015-01-04 00:37:29 +09:00
algo.go Minor refactoring 2015-01-09 02:35:20 +09:00
atomicbool_test.go Rewrite fzf in Go 2015-01-04 00:37:29 +09:00
atomicbool.go Rewrite fzf in Go 2015-01-04 00:37:29 +09:00
cache_test.go Add test cases for ChunkCache 2015-01-11 02:20:54 +09:00
cache.go Rewrite fzf in Go 2015-01-04 00:37:29 +09:00
chunklist_test.go Reduce memory footprint 2015-01-09 10:42:12 +09:00
chunklist.go Remove race conditions when accessing the last chunk 2015-01-04 05:01:13 +09:00
constants.go Rewrite fzf in Go 2015-01-04 00:37:29 +09:00
core.go Update src/README.md and package comment 2015-01-11 17:01:30 +09:00
Dockerfile.arch Refactor Makefile and Dockerfiles 2015-01-11 14:19:50 +09:00
Dockerfile.centos Refactor Makefile and Dockerfiles 2015-01-11 14:19:50 +09:00
Dockerfile.ubuntu Refactor Makefile and Dockerfiles 2015-01-11 14:19:50 +09:00
eventbox_test.go Remove unnecessary delay on non/defered interactive mode 2015-01-04 05:00:28 +09:00
eventbox.go Remove unnecessary delay on non/defered interactive mode 2015-01-04 05:00:28 +09:00
item_test.go Improve response time by only looking at top-N items 2015-01-10 01:06:18 +09:00
item.go Fix Transform result cache to speed up subsequent searches 2015-01-11 01:53:51 +09:00
LICENSE Rewrite fzf in Go 2015-01-04 00:37:29 +09:00
Makefile Refactor Makefile and Dockerfiles 2015-01-11 14:19:50 +09:00
matcher.go Improve response time by only looking at top-N items 2015-01-10 01:06:18 +09:00
merger_test.go Change Merger implementation on --no-sort 2015-01-10 14:24:12 +09:00
merger.go Change Merger implementation on --no-sort 2015-01-10 14:24:12 +09:00
options_test.go Rewrite fzf in Go 2015-01-04 00:37:29 +09:00
options.go Rewrite fzf in Go 2015-01-04 00:37:29 +09:00
pattern_test.go Fix Transform result cache to speed up subsequent searches 2015-01-11 01:53:51 +09:00
pattern.go Improve prefix/suffix cache lookup 2015-01-11 03:53:07 +09:00
reader_test.go Rewrite fzf in Go 2015-01-04 00:37:29 +09:00
reader.go Remove extraneous quote-escape 2015-01-07 09:59:24 +09:00
README.md Update src/README.md and package comment 2015-01-11 17:01:30 +09:00
terminal.go Make sure that cy is properly limited 2015-01-10 14:50:24 +09:00
tokenizer_test.go Fix index out of bounds error during Transform 2015-01-05 19:32:44 +09:00
tokenizer.go Minor refactoring 2015-01-09 02:35:20 +09:00
util_test.go Rewrite fzf in Go 2015-01-04 00:37:29 +09:00
util.go Reduce memory footprint 2015-01-09 10:42:12 +09:00

fzf in Go

This directory contains the source code for the new fzf implementation in Go. The new version has the following benefits over the previous Ruby version.

Motivation

No Ruby dependency

There have always been complaints about fzf being a Ruby script. To make matters worse, Ruby 2.1 dropped ncurses support from its standard libary. Because of the change, users running Ruby 2.1 or above were 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 easier to setup.

Performance

With the presence of GIL, Ruby cannot utilize multiple CPU cores. Even though the Ruby version of fzf was pretty responsive even for 100k+ lines, which is well above the size of the usual input, it was obvious that we could do better. Now with the Go version, GIL is gone, and the search performance scales proportional to the number of cores. On my Macbook Pro (Mid 2012), it was shown to be an order of magnitude faster on certain cases. It also starts much faster than before though the difference shouldn't be really 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 thus 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 should be not 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

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

# Build executables and tarballs for Linux using Docker
make linux

Third-party libraries used

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 (that's the reason I rewrote the whole thing in Go, right?), so please make sure that your change does not result in performance regression. Please be minded that we still don't have a quantitative measure of the performance.

License

MIT