fzf/src
Junegunn Choi a71c471405
0.15.9
2016-11-26 12:36:24 +09:00
..
algo Fix panic when pattern occurs after 2^15-th column 2016-09-21 01:15:06 +09:00
fzf Rewrite fzf in Go 2015-01-04 00:37:29 +09:00
tui [tcell] 24-bit color support 2016-11-26 00:36:38 +09:00
util Fix issues in tcell renderer and Windows build 2016-11-08 02:06:34 +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 Update Centos Dockerfile to use Go 1.7 2016-08-21 04:54:53 +09:00
Dockerfile.ubuntu Update build script 2016-02-20 21:16:24 +09:00
LICENSE Update license: 2016 2016-01-13 02:16:26 +09:00
Makefile [ncurses6] Use wcolor_set to support more than 256 color pairs 2016-11-24 00:12:43 +09:00
README.md Update build instructions for ncurses 6 and tcell 2016-11-26 11:41:57 +09:00
ansi.go [tcell] 24-bit color support 2016-11-26 00:36:38 +09:00
ansi_test.go Update ANSI processor to handle more VT-100 escape sequences 2016-11-14 02:15:23 +09:00
cache.go Micro-optimizations 2016-08-19 02:39:32 +09:00
cache_test.go Micro-optimizations 2016-08-19 02:39:32 +09:00
chunklist.go Performance fix - unnecessary rune convertion on --ansi 2015-08-02 14:25:57 +09:00
chunklist_test.go Revise ranking algorithm 2016-09-18 14:34:46 +09:00
constants.go 0.15.9 2016-11-26 12:36:24 +09:00
constants_unix.go Prepare for termbox/windows build 2016-11-07 02:32:14 +09:00
constants_windows.go Prepare for termbox/windows build 2016-11-07 02:32:14 +09:00
core.go Add --print0 option 2016-09-19 01:15:38 +09:00
history.go Lint 2015-08-02 13:11:59 +09:00
history_test.go Implement tcell-based renderer 2016-11-07 02:32:14 +09:00
item.go Micro-optimizations 2016-08-19 02:39:32 +09:00
item_test.go Micro-optimizations 2016-08-19 02:39:32 +09:00
matcher.go Revise ranking algorithm 2016-09-18 14:34:46 +09:00
merger.go Remove Offset slice from Result struct 2016-08-20 01:53:32 +09:00
merger_test.go Remove Offset slice from Result struct 2016-08-20 01:53:32 +09:00
options.go Revamp escape sequence processing for WSL 2016-11-19 22:42:15 +09:00
options_test.go Implement tcell-based renderer 2016-11-07 02:32:14 +09:00
pattern.go Use exact match by default for inverse search term 2016-10-04 02:09:03 +09:00
pattern_test.go Use exact match by default for inverse search term 2016-10-04 02:09:03 +09:00
reader.go Fix issues in tcell renderer and Windows build 2016-11-08 02:06:34 +09:00
reader_test.go Performance fix - unnecessary rune convertion on --ansi 2015-08-02 14:25:57 +09:00
result.go Fix panic when color is disabled and header lines contain ANSI colors 2016-11-09 12:05:45 +09:00
result_test.go Implement tcell-based renderer 2016-11-07 02:32:14 +09:00
terminal.go Always print scroll indicator in preview window 2016-11-26 12:34:16 +09:00
terminal_test.go Support field index expressions in preview and execute action 2016-10-03 14:33:28 +09:00
terminal_unix.go Prepare for termbox/windows build 2016-11-07 02:32:14 +09:00
terminal_windows.go Prepare for termbox/windows build 2016-11-07 02:32:14 +09:00
tokenizer.go Micro-optimizations 2016-08-19 02:39:32 +09:00
tokenizer_test.go [perf] Avoid allocating rune array for ascii string 2016-08-14 00:41:30 +09:00
update_assets.rb 0.13.5 2016-08-21 05:02:45 +09:00

README.md

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.

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

With ncurses 6

The official binaries of fzf are built with ncurses 5 because it's widely supported by different platforms. However ncurses 5 is old and has a number of limitations.

  1. Does not support more than 256 color pairs (See 357)
  2. Does not support italics
  3. Does not support 24-bit color

But you can manually build fzf with ncurses 6 to overcome some of these limitations. ncurses 6 supports up to 32767 color pairs (1), and supports italics (2). To build fzf with ncurses 6, you have to install it first. On macOS, you can use Homebrew to install it.

brew install homebrew/dupes/ncurses
LDFLAGS="-L/usr/local/opt/ncurses/lib" make install

With tcell

tcell is a portable alternative to ncurses and we currently use it to build Windows binaries. tcell has many benefits but most importantly, it supports 24-bit colors. To build fzf with tcell:

TAGS=tcell make install

However, note that tcell has its own issues.

  • Poor rendering performance compared to ncurses
  • Does not support bracketed-paste mode
  • Does not support italics unlike ncurses 6
  • Some wide characters are not correctly displayed

Test

Unit tests can be run with make test. Integration tests are written in Ruby script that should be run on tmux.

# Unit tests
make test

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

# Integration tests
ruby ../test/test_go.rb

Third-party libraries used

License

MIT