2015-01-02 04:49:30 +09:00
|
|
|
fzf in Go
|
|
|
|
=========
|
|
|
|
|
2015-01-14 02:16:03 +09:00
|
|
|
<img src="https://cloud.githubusercontent.com/assets/700826/5725028/028ea834-9b93-11e4-9198-43088c3f295d.gif" height="463" alt="fzf in go">
|
|
|
|
|
2015-01-05 12:21:56 +09:00
|
|
|
This directory contains the source code for the new fzf implementation in
|
2015-01-13 02:05:37 +09:00
|
|
|
[Go][go].
|
2015-01-02 04:49:30 +09:00
|
|
|
|
2015-01-13 02:05:37 +09:00
|
|
|
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.
|
|
|
|
|
|
|
|
```sh
|
|
|
|
cd ~/.fzf
|
|
|
|
git pull
|
|
|
|
./install
|
|
|
|
```
|
|
|
|
|
2015-01-18 16:34:10 +09:00
|
|
|
Otherwise, follow [the instruction][install] as before. You can also install
|
|
|
|
fzf using Homebrew if you prefer that way.
|
2015-01-18 16:32:22 +09:00
|
|
|
|
2015-01-13 02:05:37 +09:00
|
|
|
Motivations
|
|
|
|
-----------
|
2015-01-11 16:59:57 +09:00
|
|
|
|
|
|
|
### No Ruby dependency
|
|
|
|
|
|
|
|
There have always been complaints about fzf being a Ruby script. To make
|
2015-01-13 02:05:37 +09:00
|
|
|
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
|
2015-01-11 16:59:57 +09:00
|
|
|
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
|
2015-01-13 02:05:37 +09:00
|
|
|
and should be easier to setup.
|
2015-01-11 16:59:57 +09:00
|
|
|
|
|
|
|
### Performance
|
|
|
|
|
2015-01-13 02:05:37 +09:00
|
|
|
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][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.
|
2015-01-11 16:59:57 +09:00
|
|
|
|
|
|
|
Build
|
|
|
|
-----
|
|
|
|
|
|
|
|
```sh
|
|
|
|
# Build fzf executables and tarballs
|
2016-04-26 01:45:04 +09:00
|
|
|
make release
|
2015-01-11 16:59:57 +09:00
|
|
|
|
|
|
|
# Install the executable to ../bin directory
|
|
|
|
make install
|
|
|
|
|
|
|
|
# Build executables and tarballs for Linux using Docker
|
|
|
|
make linux
|
|
|
|
```
|
|
|
|
|
2016-11-26 11:41:57 +09:00
|
|
|
### 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][357])
|
|
|
|
2. Does not support italics
|
|
|
|
3. Does not support 24-bit color
|
|
|
|
|
|
|
|
[357]: https://github.com/junegunn/fzf/issues/357
|
|
|
|
|
|
|
|
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.
|
|
|
|
|
|
|
|
```sh
|
|
|
|
brew install homebrew/dupes/ncurses
|
|
|
|
LDFLAGS="-L/usr/local/opt/ncurses/lib" make install
|
|
|
|
```
|
|
|
|
|
|
|
|
### With tcell
|
|
|
|
|
|
|
|
[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:
|
|
|
|
|
|
|
|
```sh
|
|
|
|
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
|
|
|
|
|
2016-09-07 09:58:18 +09:00
|
|
|
Test
|
|
|
|
----
|
|
|
|
|
|
|
|
Unit tests can be run with `make test`. Integration tests are written in Ruby
|
|
|
|
script that should be run on tmux.
|
|
|
|
|
|
|
|
```sh
|
|
|
|
# Unit tests
|
|
|
|
make test
|
|
|
|
|
|
|
|
# Install the executable to ../bin directory
|
|
|
|
make install
|
|
|
|
|
|
|
|
# Integration tests
|
|
|
|
ruby ../test/test_go.rb
|
|
|
|
```
|
|
|
|
|
2015-01-02 04:49:30 +09:00
|
|
|
Third-party libraries used
|
|
|
|
--------------------------
|
|
|
|
|
2015-01-05 12:21:56 +09:00
|
|
|
- [ncurses][ncurses]
|
2015-01-02 04:49:30 +09:00
|
|
|
- [mattn/go-runewidth](https://github.com/mattn/go-runewidth)
|
2016-10-24 09:44:56 +09:00
|
|
|
- Licensed under [MIT](http://mattn.mit-license.org)
|
2015-01-02 04:49:30 +09:00
|
|
|
- [mattn/go-shellwords](https://github.com/mattn/go-shellwords)
|
2016-10-24 09:44:56 +09:00
|
|
|
- Licensed under [MIT](http://mattn.mit-license.org)
|
|
|
|
- [mattn/go-isatty](https://github.com/mattn/go-isatty)
|
|
|
|
- Licensed under [MIT](http://mattn.mit-license.org)
|
2016-11-26 11:41:57 +09:00
|
|
|
- [tcell](https://github.com/gdamore/tcell)
|
|
|
|
- Licensed under [Apache License 2.0](https://github.com/gdamore/tcell/blob/master/LICENSE)
|
2015-01-02 04:49:30 +09:00
|
|
|
|
|
|
|
License
|
|
|
|
-------
|
|
|
|
|
2015-01-05 12:21:56 +09:00
|
|
|
[MIT](LICENSE)
|
|
|
|
|
2015-01-18 16:32:22 +09:00
|
|
|
[install]: https://github.com/junegunn/fzf#installation
|
2015-01-05 12:21:56 +09:00
|
|
|
[go]: https://golang.org/
|
2015-01-11 16:59:57 +09:00
|
|
|
[gil]: http://en.wikipedia.org/wiki/Global_Interpreter_Lock
|
2015-01-05 12:21:56 +09:00
|
|
|
[ncurses]: https://www.gnu.org/software/ncurses/
|
|
|
|
[req]: http://golang.org/doc/install
|
2016-11-26 11:41:57 +09:00
|
|
|
[tcell]: https://github.com/gdamore/tcell
|