From ff248d566d424beb1eda8f7984f385658353b244 Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Sun, 22 Jan 2017 14:13:37 +0900 Subject: [PATCH] Drop ncurses dependency Close #818 --- CHANGELOG.md | 2 ++ install | 18 ++++++++++----- man/man1/fzf-tmux.1 | 2 +- man/man1/fzf.1 | 2 +- src/Makefile | 55 ++++++++++++++++++++++++++++++++++++--------- src/README.md | 17 +++++++++++--- src/constants.go | 2 +- src/terminal.go | 5 ++++- src/tui/dummy.go | 45 +++++++++++++++++++++++++++++++++++++ src/tui/ncurses.go | 5 +++++ src/tui/tcell.go | 4 ++++ 11 files changed, 135 insertions(+), 22 deletions(-) create mode 100644 src/tui/dummy.go diff --git a/CHANGELOG.md b/CHANGELOG.md index fac6f347..e6df93e3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,8 @@ CHANGELOG 0.16.2 ------ +- Dropped ncurses dependency +- Binaries for freebsd, openbsd, arm5, arm6, arm7, and arm8 - Added support for composite actions in `--bind`. Multiple actions can be chained using `+` separator. - e.g. `fzf --bind 'ctrl-y:execute(echo -n {} | pbcopy)+abort'` diff --git a/install b/install index baa7870f..0ff03103 100755 --- a/install +++ b/install @@ -2,7 +2,7 @@ set -u -version=0.16.1 +version=0.16.2-alpha auto_completion= key_bindings= update_config=2 @@ -160,10 +160,18 @@ archi=$(uname -sm) binary_available=1 binary_error="" case "$archi" in - Darwin\ x86_64) download fzf-$version-darwin_${binary_arch:-amd64} ;; - Darwin\ i*86) download fzf-$version-darwin_${binary_arch:-386} ;; - Linux\ x86_64) download fzf-$version-linux_${binary_arch:-amd64} ;; - Linux\ i*86) download fzf-$version-linux_${binary_arch:-386} ;; + Darwin\ *64) download fzf-$version-darwin_${binary_arch:-amd64} ;; + Darwin\ *86) download fzf-$version-darwin_${binary_arch:-386} ;; + Linux\ *64) download fzf-$version-linux_${binary_arch:-amd64} ;; + Linux\ *86) download fzf-$version-linux_${binary_arch:-386} ;; + Linux\ armv5*) download fzf-$version-linux_${binary_arch:-arm5} ;; + Linux\ armv6*) download fzf-$version-linux_${binary_arch:-arm6} ;; + Linux\ armv7*) download fzf-$version-linux_${binary_arch:-arm7} ;; + Linux\ armv8*) download fzf-$version-linux_${binary_arch:-arm8} ;; + FreeBSD\ *64) download fzf-$version-freebsd_${binary_arch:-amd64} ;; + FreeBSD\ *86) download fzf-$version-freebsd_${binary_arch:-386} ;; + OpenBSD\ *64) download fzf-$version-openbsd_${binary_arch:-amd64} ;; + OpenBSD\ *86) download fzf-$version-openbsd_${binary_arch:-386} ;; *) binary_available=0 binary_error=1 ;; esac diff --git a/man/man1/fzf-tmux.1 b/man/man1/fzf-tmux.1 index dd5c0967..bd7c756d 100644 --- a/man/man1/fzf-tmux.1 +++ b/man/man1/fzf-tmux.1 @@ -21,7 +21,7 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. .. -.TH fzf-tmux 1 "Jan 2017" "fzf 0.16.1" "fzf-tmux - open fzf in tmux split pane" +.TH fzf-tmux 1 "Jan 2017" "fzf 0.16.2" "fzf-tmux - open fzf in tmux split pane" .SH NAME fzf-tmux - open fzf in tmux split pane diff --git a/man/man1/fzf.1 b/man/man1/fzf.1 index b139dcc0..098ae6a4 100644 --- a/man/man1/fzf.1 +++ b/man/man1/fzf.1 @@ -21,7 +21,7 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. .. -.TH fzf 1 "Jan 2017" "fzf 0.16.1" "fzf - a command-line fuzzy finder" +.TH fzf 1 "Jan 2017" "fzf 0.16.2" "fzf - a command-line fuzzy finder" .SH NAME fzf - a command-line fuzzy finder diff --git a/src/Makefile b/src/Makefile index 77a40944..e702548f 100644 --- a/src/Makefile +++ b/src/Makefile @@ -15,11 +15,17 @@ SRCDIR := $(GOPATH)/src/github.com/junegunn/fzf/src DOCKEROPTS := -i -t -v $(ROOTDIR):/fzf/src BINARY32 := fzf-$(GOOS)_386 BINARY64 := fzf-$(GOOS)_amd64 +BINARYARM5 := fzf-$(GOOS)_arm5 +BINARYARM6 := fzf-$(GOOS)_arm6 BINARYARM7 := fzf-$(GOOS)_arm7 +BINARYARM8 := fzf-$(GOOS)_arm8 VERSION := $(shell awk -F= '/version =/ {print $$2}' constants.go | tr -d "\" ") RELEASE32 := fzf-$(VERSION)-$(GOOS)_386 RELEASE64 := fzf-$(VERSION)-$(GOOS)_amd64 +RELEASEARM5 := fzf-$(VERSION)-$(GOOS)_arm5 +RELEASEARM6 := fzf-$(VERSION)-$(GOOS)_arm6 RELEASEARM7 := fzf-$(VERSION)-$(GOOS)_arm7 +RELEASEARM8 := fzf-$(VERSION)-$(GOOS)_arm8 export GOPATH UNAME_M := $(shell uname -m) @@ -35,16 +41,32 @@ all: fzf/$(BINARY) ifeq ($(GOOS),windows) release: fzf/$(BINARY32) fzf/$(BINARY64) - -cd fzf && cp $(BINARY32) $(RELEASE32).exe && zip $(RELEASE32).zip $(RELEASE32).exe - cd fzf && cp $(BINARY64) $(RELEASE64).exe && zip $(RELEASE64).zip $(RELEASE64).exe && \ - rm -f $(RELEASE32).exe $(RELEASE64).exe + cd fzf && cp $(BINARY32) $(RELEASE32).exe && zip $(RELEASE32).zip $(RELEASE32).exe + cd fzf && cp $(BINARY64) $(RELEASE64).exe && zip $(RELEASE64).zip $(RELEASE64).exe + cd fzf && rm -f $(RELEASE32).exe $(RELEASE64).exe +else ifeq ($(GOOS),linux) +release: fzf/$(BINARY32) fzf/$(BINARY64) fzf/$(BINARYARM5) fzf/$(BINARYARM6) fzf/$(BINARYARM7) fzf/$(BINARYARM8) + cd fzf && cp $(BINARY32) $(RELEASE32) && tar -czf $(RELEASE32).tgz $(RELEASE32) + cd fzf && cp $(BINARY64) $(RELEASE64) && tar -czf $(RELEASE64).tgz $(RELEASE64) + cd fzf && cp $(BINARYARM5) $(RELEASEARM5) && tar -czf $(RELEASEARM5).tgz $(RELEASEARM5) + cd fzf && cp $(BINARYARM6) $(RELEASEARM6) && tar -czf $(RELEASEARM6).tgz $(RELEASEARM6) + cd fzf && cp $(BINARYARM7) $(RELEASEARM7) && tar -czf $(RELEASEARM7).tgz $(RELEASEARM7) + cd fzf && cp $(BINARYARM8) $(RELEASEARM8) && tar -czf $(RELEASEARM8).tgz $(RELEASEARM8) + cd fzf && rm -f $(RELEASE32) $(RELEASE64) $(RELEASEARM5) $(RELEASEARM6) $(RELEASEARM7) $(RELEASEARM8) else -release: test fzf/$(BINARY32) fzf/$(BINARY64) - -cd fzf && cp $(BINARY32) $(RELEASE32) && tar -czf $(RELEASE32).tgz $(RELEASE32) - cd fzf && cp $(BINARY64) $(RELEASE64) && tar -czf $(RELEASE64).tgz $(RELEASE64) && \ - rm -f $(RELEASE32) $(RELEASE64) +release: fzf/$(BINARY32) fzf/$(BINARY64) + cd fzf && cp $(BINARY32) $(RELEASE32) && tar -czf $(RELEASE32).tgz $(RELEASE32) + cd fzf && cp $(BINARY64) $(RELEASE64) && tar -czf $(RELEASE64).tgz $(RELEASE64) + cd fzf && rm -f $(RELEASE32) $(RELEASE64) endif +release-all: clean test + GOOS=darwin make release + GOOS=linux make release + GOOS=freebsd make release + GOOS=openbsd make release + GOOS=windows make release + $(SRCDIR): mkdir -p $(shell dirname $(SRCDIR)) ln -s $(ROOTDIR) $(SRCDIR) @@ -60,7 +82,7 @@ android-build: $(SRCDIR) rm -f $(RELEASEARM7) test: deps - SHELL=/bin/sh GOOS=$(GOOS) go test -v -tags "$(TAGS)" ./... + SHELL=/bin/sh GOOS= go test -v -tags "$(TAGS)" ./... install: $(BINDIR)/fzf @@ -71,10 +93,23 @@ clean: cd fzf && rm -f fzf-* fzf/$(BINARY32): deps - cd fzf && GOARCH=386 CGO_ENABLED=1 go build -a -ldflags "-w -extldflags=$(LDFLAGS)" -tags "$(TAGS)" -o $(BINARY32) + cd fzf && GOARCH=386 go build -a -ldflags "-w -extldflags=$(LDFLAGS)" -tags "$(TAGS)" -o $(BINARY32) fzf/$(BINARY64): deps - cd fzf && go build -a -ldflags "-w -extldflags=$(LDFLAGS)" -tags "$(TAGS)" -o $(BINARY64) + cd fzf && GOARCH=amd64 go build -a -ldflags "-w -extldflags=$(LDFLAGS)" -tags "$(TAGS)" -o $(BINARY64) + +# https://github.com/golang/go/wiki/GoArm +fzf/$(BINARYARM5): deps + cd fzf && GOARCH=arm GOARM=5 go build -a -ldflags "-w -extldflags=$(LDFLAGS)" -tags "$(TAGS)" -o $(BINARYARM5) + +fzf/$(BINARYARM6): deps + cd fzf && GOARCH=arm GOARM=6 go build -a -ldflags "-w -extldflags=$(LDFLAGS)" -tags "$(TAGS)" -o $(BINARYARM6) + +fzf/$(BINARYARM7): deps + cd fzf && GOARCH=arm GOARM=7 go build -a -ldflags "-w -extldflags=$(LDFLAGS)" -tags "$(TAGS)" -o $(BINARYARM7) + +fzf/$(BINARYARM8): deps + cd fzf && GOARCH=arm64 go build -a -ldflags "-w -extldflags=$(LDFLAGS)" -tags "$(TAGS)" -o $(BINARYARM8) $(BINDIR)/fzf: fzf/$(BINARY) | $(BINDIR) cp -f fzf/$(BINARY) $(BINDIR) diff --git a/src/README.md b/src/README.md index 2d065a92..ec88ca23 100644 --- a/src/README.md +++ b/src/README.md @@ -59,20 +59,31 @@ Unit tests can be run with `make test`. Integration tests are written in Ruby script that should be run on tmux. ```sh +cd src + # Unit tests make test +# Integration tests +ruby ../test/test_go.rb + +# Build binary for the platform +make + # Install the executable to ../bin directory make install -# Integration tests -ruby ../test/test_go.rb +# Make release archives +make release + +# Make release archives for all supported platforms +make release-all ``` Third-party libraries used -------------------------- -- [ncurses][ncurses] +- ~[ncurses][ncurses]~ - [mattn/go-runewidth](https://github.com/mattn/go-runewidth) - Licensed under [MIT](http://mattn.mit-license.org) - [mattn/go-shellwords](https://github.com/mattn/go-shellwords) diff --git a/src/constants.go b/src/constants.go index 0faa7da1..082909b8 100644 --- a/src/constants.go +++ b/src/constants.go @@ -8,7 +8,7 @@ import ( const ( // Current version - version = "0.16.1" + version = "0.16.2-alpha" // Core coordinatorDelayMax time.Duration = 100 * time.Millisecond diff --git a/src/terminal.go b/src/terminal.go index 9e30f302..7fcef605 100644 --- a/src/terminal.go +++ b/src/terminal.go @@ -305,8 +305,11 @@ func NewTerminal(opts *Options, eventBox *util.EventBox) *Terminal { return util.Max(maxHeight, minHeight) } renderer = tui.NewLightRenderer(opts.Theme, opts.Black, opts.Mouse, opts.Tabstop, maxHeightFunc) - } else { + } else if tui.HasFullscreenRenderer() { renderer = tui.NewFullscreenRenderer(opts.Theme, opts.Black, opts.Mouse) + } else { + renderer = tui.NewLightRenderer(opts.Theme, opts.Black, opts.Mouse, opts.Tabstop, + func(h int) int { return h }) } wordRubout := "[^[:alnum:]][[:alnum:]]" wordNext := "[[:alnum:]][^[:alnum:]]|(.$)" diff --git a/src/tui/dummy.go b/src/tui/dummy.go new file mode 100644 index 00000000..01179c89 --- /dev/null +++ b/src/tui/dummy.go @@ -0,0 +1,45 @@ +// +build !ncurses +// +build !tcell +// +build !windows + +package tui + +type Attr int + +func HasFullscreenRenderer() bool { + return false +} + +func (a Attr) Merge(b Attr) Attr { + return a | b +} + +const ( + AttrRegular Attr = Attr(0) + Bold = Attr(1) + Dim = Attr(1 << 1) + Italic = Attr(1 << 2) + Underline = Attr(1 << 3) + Blink = Attr(1 << 4) + Blink2 = Attr(1 << 5) + Reverse = Attr(1 << 6) +) + +func (r *FullscreenRenderer) Init() {} +func (r *FullscreenRenderer) Pause() {} +func (r *FullscreenRenderer) Clear() {} +func (r *FullscreenRenderer) Refresh() {} +func (r *FullscreenRenderer) Close() {} + +func (r *FullscreenRenderer) Resume() bool { return false } +func (r *FullscreenRenderer) DoesAutoWrap() bool { return false } +func (r *FullscreenRenderer) IsOptimized() bool { return false } +func (r *FullscreenRenderer) GetChar() Event { return Event{} } +func (r *FullscreenRenderer) MaxX() int { return 0 } +func (r *FullscreenRenderer) MaxY() int { return 0 } + +func (r *FullscreenRenderer) RefreshWindows(windows []Window) {} + +func (r *FullscreenRenderer) NewWindow(top int, left int, width int, height int, border bool) Window { + return nil +} diff --git a/src/tui/ncurses.go b/src/tui/ncurses.go index 0978ea8a..2706c91d 100644 --- a/src/tui/ncurses.go +++ b/src/tui/ncurses.go @@ -1,3 +1,4 @@ +// +build ncurses // +build !windows // +build !tcell @@ -32,6 +33,10 @@ import ( "unicode/utf8" ) +func HasFullscreenRenderer() bool { + return true +} + type Attr C.uint type CursesWindow struct { diff --git a/src/tui/tcell.go b/src/tui/tcell.go index c898a383..4836bf3c 100644 --- a/src/tui/tcell.go +++ b/src/tui/tcell.go @@ -15,6 +15,10 @@ import ( "github.com/junegunn/go-runewidth" ) +func HasFullscreenRenderer() bool { + return true +} + func (p ColorPair) style() tcell.Style { style := tcell.StyleDefault return style.Foreground(tcell.Color(p.Fg())).Background(tcell.Color(p.Bg()))