From 773d9976a00eff57998dc93634c36a81088bce04 Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Tue, 28 Jan 2014 02:58:20 +0900 Subject: [PATCH 1/9] Use Curses.getch to support mouse (WIP) --- fzf | 101 +++++++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 66 insertions(+), 35 deletions(-) diff --git a/fzf b/fzf index aa6e81e..3b13354 100755 --- a/fzf +++ b/fzf @@ -40,6 +40,14 @@ require 'thread' require 'curses' require 'set' +unless String.method_defined? :force_encoding + class String + def force_encoding *arg + self + end + end +end + class FZF C = Curses attr_reader :rxflag, :sort, :color, :multi, :query, :extended @@ -110,7 +118,7 @@ class FZF end end - @source = source + @source = source.clone @mtx = Mutex.new @cv = ConditionVariable.new @events = {} @@ -463,6 +471,8 @@ class FZF def init_screen C.init_screen + C.mousemask C::BUTTON1_CLICKED | C::BUTTON2_CLICKED + C.stdscr.keypad(true) C.start_color dbg = if C.respond_to?(:use_default_colors) @@ -684,6 +694,7 @@ class FZF got = nil begin tty = IO.open(IO.sysopen('/dev/tty'), 'r') + $stdin.reopen(tty) input = @query.get.dup cursor = input.length backword = proc { @@ -706,8 +717,8 @@ class FZF backword.call input = input[0...cursor] + input[pcursor..-1] }, - 127 => proc { input[cursor -= 1] = '' if cursor > 0 }, - 9 => proc { |o| + ctrl(:h) => proc { input[cursor -= 1] = '' if cursor > 0 }, + ctrl(:i) => proc { |o| if @multi && sel = pick if @selects.has_key? sel @selects.delete sel @@ -716,57 +727,77 @@ class FZF end @vcursor.set { |v| @vcursors << v - v + (o == :stab ? 1 : -1) + v + (o == C::KEY_BTAB ? 1 : -1) } update_list false end }, - :left => proc { cursor = [0, cursor - 1].max; nil }, - :right => proc { cursor = [input.length, cursor + 1].min; nil }, + ctrl(:b) => proc { cursor = [0, cursor - 1].max; nil }, + ctrl(:f) => proc { cursor = [input.length, cursor + 1].min; nil }, :alt_b => proc { backword.call; nil }, :alt_f => proc { cursor += (input[cursor..-1].index(/(\S\s)|(.$)/) || -1) + 1 nil }, } - actions[ctrl(:b)] = actions[:left] - actions[ctrl(:f)] = actions[:right] - actions[ctrl(:h)] = actions[127] - actions[ctrl(:n)] = actions[ctrl(:j)] - actions[ctrl(:p)] = actions[ctrl(:k)] - actions[ctrl(:q)] = actions[ctrl(:g)] = actions[ctrl(:c)] = actions[:esc] - actions[:stab] = actions[9] + actions[C::KEY_LEFT] = actions[ctrl(:b)] + actions[C::KEY_RIGHT] = actions[ctrl(:f)] + actions[127] = actions[ctrl(:h)] + actions[C::KEY_DOWN] = actions[ctrl(:n)] = actions[ctrl(:j)] + actions[C::KEY_UP] = actions[ctrl(:p)] = actions[ctrl(:k)] + actions[ctrl(:q)] = actions[ctrl(:g)] = actions[ctrl(:c)] = actions[:esc] + actions[C::KEY_BTAB] = actions[ctrl(:i)] emit(:key) { [@query.get, cursor] } unless @query.empty? while true @cursor_x.set cursor render { print_input } - ord = tty.getc.ord - ord = - case ord = (tty.read_nonblock(1).ord rescue :esc) - when 91 - case (tty.read_nonblock(1).ord rescue nil) - when 68 then :left - when 67 then :right - when 66 then ctrl(:j) - when 65 then ctrl(:k) - when 90 then :stab - else next - end - when 'b'.ord then :alt_b - when 'f'.ord then :alt_f - when :esc then :esc - else next - end if ord == 27 + C.stdscr.timeout = -1 + ch = C.getch - upd = actions.fetch(ord, proc { |ord| - char = [ord].pack('U*') - if char =~ /[[:print:]]/ - input.insert cursor, char + case ch + when C::KEY_MOUSE + if m = C.getmouse + # TODO: unicode + p m.bstate + end + when 27 + C.stdscr.timeout = 0 + ch = + case ch2 = C.getch + when 'b' then :alt_b + when 'f' then :alt_f + when nil then :esc + else + ch2 + end + when Fixnum + bytes = 1 + if (ch >> 7) == 1 + 6.downto(2) do |shift| + if (ch >> shift) & 0x1 == 0 + break + end + bytes += 1 + end + end + if bytes > 1 + chs = [ch] + (bytes - 1).times do + chs << C.getch + end + # TODO: ruby 1.8 + ch = chs.pack('C*').force_encoding('UTF-8') + end + end + + upd = actions.fetch(ch, proc { |chr| + if chr =~ /[[:print:]]/ + input.insert cursor, chr cursor += 1 end - }).call(ord) + }).call(ch) # Dispatch key event emit(:key) { [@query.set(input.dup), cursor] } if upd From 0d83cae2ecf5f193b5092d0d67c9ac55794b4573 Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Tue, 28 Jan 2014 19:02:55 +0900 Subject: [PATCH 2/9] Implement mouse support --- fzf | 48 ++++++++++++++++++++++++++++++++++++------------ 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/fzf b/fzf index 3b13354..414bac0 100755 --- a/fzf +++ b/fzf @@ -471,7 +471,10 @@ class FZF def init_screen C.init_screen - C.mousemask C::BUTTON1_CLICKED | C::BUTTON2_CLICKED + if ENV.fetch('FZF_MOUSE_ENABLED', '1') == '1' + C.mousemask C::BUTTON1_CLICKED | C::BUTTON1_DOUBLE_CLICKED | + C::BUTTON2_PRESSED | C::BUTTON4_PRESSED + end C.stdscr.keypad(true) C.start_color dbg = @@ -482,6 +485,7 @@ class FZF C::COLOR_BLACK end C.raw + C.nonl C.noecho if @color @@ -537,6 +541,7 @@ class FZF exit 1 end else + $stdin.reopen IO.open(IO.sysopen('/dev/tty'), 'r') @source end @@ -675,6 +680,7 @@ class FZF def start_renderer Thread.new do begin + refresh while blk = @queue.shift blk.call refresh @@ -690,11 +696,14 @@ class FZF nil end + def vselect &prc + @vcursor.set { |v| @vcursors << v; prc.call v } + update_list false + end + def start_loop got = nil begin - tty = IO.open(IO.sysopen('/dev/tty'), 'r') - $stdin.reopen(tty) input = @query.get.dup cursor = input.length backword = proc { @@ -710,8 +719,8 @@ class FZF ctrl(:u) => proc { input = input[cursor..-1]; cursor = 0 }, ctrl(:a) => proc { cursor = 0; nil }, ctrl(:e) => proc { cursor = input.length; nil }, - ctrl(:j) => proc { @vcursor.set { |v| @vcursors << v; v - 1 }; update_list false }, - ctrl(:k) => proc { @vcursor.set { |v| @vcursors << v; v + 1 }; update_list false }, + ctrl(:j) => proc { vselect { |v| v - 1 } }, + ctrl(:k) => proc { vselect { |v| v + 1 } }, ctrl(:w) => proc { pcursor = cursor backword.call @@ -725,11 +734,7 @@ class FZF else @selects[sel] = 1 end - @vcursor.set { |v| - @vcursors << v - v + (o == C::KEY_BTAB ? 1 : -1) - } - update_list false + vselect { |v| v + (o == C::KEY_BTAB ? 1 : -1) } end }, ctrl(:b) => proc { cursor = [0, cursor - 1].max; nil }, @@ -759,8 +764,27 @@ class FZF case ch when C::KEY_MOUSE if m = C.getmouse - # TODO: unicode - p m.bstate + case m.bstate + when C::BUTTON1_CLICKED + if m.y == cursor_y + cursor = [0, [input.length, m.x - 2].min].max + elsif m.x > 1 && m.y <= max_items + vselect { |v| + tv = max_items - m.y - 1 + ch = ctrl(:i) if v == tv + tv + } + end + when C::BUTTON1_DOUBLE_CLICKED + if m.x > 1 && m.x <= max_items + vselect { |v| max_items - m.y - 1 } + ch = ctrl(:m) + end + when 0x8000000, C::BUTTON2_PRESSED + ch = C::KEY_DOWN + when C::BUTTON4_PRESSED + ch = C::KEY_UP + end end when 27 C.stdscr.timeout = 0 From 6aa168833b71ec1394437f2d93073c7a2949efae Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Wed, 29 Jan 2014 02:08:18 +0900 Subject: [PATCH 3/9] Ruby 1.8 compatibility --- fzf | 37 ++++++++++++++++++++++++------------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/fzf b/fzf index 414bac0..3c80a47 100755 --- a/fzf +++ b/fzf @@ -701,6 +701,20 @@ class FZF update_list false end + def num_unicode_bytes chr + # http://en.wikipedia.org/wiki/UTF-8 + if chr & 0b10000000 > 0 + bytes = 0 + 7.downto(2) do |shift| + break if (chr >> shift) & 0x1 == 0 + bytes += 1 + end + bytes + else + 1 + end + end + def start_loop got = nil begin @@ -797,22 +811,19 @@ class FZF ch2 end when Fixnum - bytes = 1 - if (ch >> 7) == 1 - 6.downto(2) do |shift| - if (ch >> shift) & 0x1 == 0 - break - end - bytes += 1 - end - end - if bytes > 1 + # Ruby 1.8 + if (ch.chr rescue nil) && ch.chr =~ /[[:print:]]/ + ch = ch.chr + else chs = [ch] - (bytes - 1).times do + (num_unicode_bytes(ch) - 1).times do |i| chs << C.getch end - # TODO: ruby 1.8 - ch = chs.pack('C*').force_encoding('UTF-8') + + # UTF-8 TODO Ruby 1.8 + if chs.length > 1 + ch = chs.pack('C*').force_encoding('UTF-8') + end end end From 6fb4b6d09704e34860027b038028fedd653e9b3c Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Wed, 29 Jan 2014 02:08:42 +0900 Subject: [PATCH 4/9] Do not move vcursor on select using mouse --- fzf | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/fzf b/fzf index 3c80a47..071a701 100755 --- a/fzf +++ b/fzf @@ -748,7 +748,7 @@ class FZF else @selects[sel] = 1 end - vselect { |v| v + (o == C::KEY_BTAB ? 1 : -1) } + vselect { |v| v + (o == C::KEY_BTAB ? 1 : -1) } unless o == :select end }, ctrl(:b) => proc { cursor = [0, cursor - 1].max; nil }, @@ -762,10 +762,10 @@ class FZF actions[C::KEY_LEFT] = actions[ctrl(:b)] actions[C::KEY_RIGHT] = actions[ctrl(:f)] actions[127] = actions[ctrl(:h)] - actions[C::KEY_DOWN] = actions[ctrl(:n)] = actions[ctrl(:j)] - actions[C::KEY_UP] = actions[ctrl(:p)] = actions[ctrl(:k)] - actions[ctrl(:q)] = actions[ctrl(:g)] = actions[ctrl(:c)] = actions[:esc] - actions[C::KEY_BTAB] = actions[ctrl(:i)] + actions[C::KEY_DOWN] = actions[ctrl(:n)] = actions[ctrl(:j)] + actions[C::KEY_UP] = actions[ctrl(:p)] = actions[ctrl(:k)] + actions[ctrl(:q)] = actions[ctrl(:g)] = actions[ctrl(:c)] = actions[:esc] + actions[:select] = actions[C::KEY_BTAB] = actions[ctrl(:i)] emit(:key) { [@query.get, cursor] } unless @query.empty? while true @@ -781,11 +781,12 @@ class FZF case m.bstate when C::BUTTON1_CLICKED if m.y == cursor_y + # TODO Wide-characters cursor = [0, [input.length, m.x - 2].min].max elsif m.x > 1 && m.y <= max_items vselect { |v| tv = max_items - m.y - 1 - ch = ctrl(:i) if v == tv + ch = :select if v == tv tv } end From aad335475c606fcba6b6eaf3a3626e06d385fe51 Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Thu, 30 Jan 2014 01:01:31 +0900 Subject: [PATCH 5/9] Shift-click and wheel --- fzf | 37 +++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/fzf b/fzf index 071a701..241d597 100755 --- a/fzf +++ b/fzf @@ -7,7 +7,7 @@ # / __/ / /_/ __/ # /_/ /___/_/ Fuzzy finder for your shell # -# Version: 0.6.2-devel (January 22, 2014) +# Version: 0.7.0-devel (January 30, 2014) # # Author: Junegunn Choi # URL: https://github.com/junegunn/fzf @@ -472,8 +472,8 @@ class FZF def init_screen C.init_screen if ENV.fetch('FZF_MOUSE_ENABLED', '1') == '1' - C.mousemask C::BUTTON1_CLICKED | C::BUTTON1_DOUBLE_CLICKED | - C::BUTTON2_PRESSED | C::BUTTON4_PRESSED + C.mouseinterval 0 + C.mousemask C::ALL_MOUSE_EVENTS end C.stdscr.keypad(true) C.start_color @@ -748,7 +748,13 @@ class FZF else @selects[sel] = 1 end - vselect { |v| v + (o == C::KEY_BTAB ? 1 : -1) } unless o == :select + vselect { |v| + v + case o + when :select then 0 + when C::KEY_BTAB then 1 + else -1 + end + } end }, ctrl(:b) => proc { cursor = [0, cursor - 1].max; nil }, @@ -768,6 +774,7 @@ class FZF actions[:select] = actions[C::KEY_BTAB] = actions[ctrl(:i)] emit(:key) { [@query.get, cursor] } unless @query.empty? + pmv = nil while true @cursor_x.set cursor render { print_input } @@ -778,26 +785,28 @@ class FZF case ch when C::KEY_MOUSE if m = C.getmouse - case m.bstate - when C::BUTTON1_CLICKED + st = m.bstate + if ((st & C::BUTTON1_PRESSED) | (st & C::BUTTON1_RELEASED)) > 0 if m.y == cursor_y # TODO Wide-characters cursor = [0, [input.length, m.x - 2].min].max elsif m.x > 1 && m.y <= max_items vselect { |v| tv = max_items - m.y - 1 - ch = :select if v == tv + if st & C::BUTTON1_RELEASED > 0 + if (st & C::BUTTON_SHIFT) > 0 + ch = :select + elsif pmv == tv + ch = ctrl(:m) + end + pmv = tv + end tv } end - when C::BUTTON1_DOUBLE_CLICKED - if m.x > 1 && m.x <= max_items - vselect { |v| max_items - m.y - 1 } - ch = ctrl(:m) - end - when 0x8000000, C::BUTTON2_PRESSED + elsif ((st & 0x8000000) | (st & C::BUTTON2_PRESSED)) > 0 ch = C::KEY_DOWN - when C::BUTTON4_PRESSED + elsif (st & C::BUTTON4_PRESSED) > 0 ch = C::KEY_UP end end From b0eca20dc20ff8e614947fa65a73e68f20c55c5a Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Thu, 30 Jan 2014 02:51:06 +0900 Subject: [PATCH 6/9] Minor refactoring --- fzf | 62 ++++++++++++++++++++++++++++++++----------------------------- 1 file changed, 33 insertions(+), 29 deletions(-) diff --git a/fzf b/fzf index 241d597..d4228b3 100755 --- a/fzf +++ b/fzf @@ -174,7 +174,8 @@ class FZF Environment variables FZF_DEFAULT_COMMAND Default command to use when input is tty - FZF_DEFAULT_OPTS Defaults options. (e.g. "-x -m --sort 10000")] + $/ + $/ + FZF_DEFAULT_OPTS Defaults options. (e.g. "-x -m --sort 10000") + FZF_MOUSE_ENABLED Set to 0 to disable mouse] + $/ + $/ exit x end @@ -471,7 +472,7 @@ class FZF def init_screen C.init_screen - if ENV.fetch('FZF_MOUSE_ENABLED', '1') == '1' + unless ENV.fetch('FZF_MOUSE_ENABLED', '1') == '0' C.mouseinterval 0 C.mousemask C::ALL_MOUSE_EVENTS end @@ -715,6 +716,10 @@ class FZF end end + def test_mouse st, *states + states.any? { |s| s & st > 0 } + end + def start_loop got = nil begin @@ -765,13 +770,13 @@ class FZF nil }, } - actions[C::KEY_LEFT] = actions[ctrl(:b)] - actions[C::KEY_RIGHT] = actions[ctrl(:f)] - actions[127] = actions[ctrl(:h)] - actions[C::KEY_DOWN] = actions[ctrl(:n)] = actions[ctrl(:j)] - actions[C::KEY_UP] = actions[ctrl(:p)] = actions[ctrl(:k)] - actions[ctrl(:q)] = actions[ctrl(:g)] = actions[ctrl(:c)] = actions[:esc] - actions[:select] = actions[C::KEY_BTAB] = actions[ctrl(:i)] + actions[C::KEY_UP] = actions[ctrl(:p)] = actions[ctrl(:k)] + actions[C::KEY_DOWN] = actions[ctrl(:n)] = actions[ctrl(:j)] + actions[C::KEY_LEFT] = actions[ctrl(:b)] + actions[C::KEY_RIGHT] = actions[ctrl(:f)] + actions[C::KEY_BTAB] = actions[:select] = actions[ctrl(:i)] + actions[C::KEY_BACKSPACE] = actions[127] = actions[ctrl(:h)] + actions[ctrl(:q)] = actions[ctrl(:g)] = actions[ctrl(:c)] = actions[:esc] emit(:key) { [@query.get, cursor] } unless @query.empty? pmv = nil @@ -786,15 +791,15 @@ class FZF when C::KEY_MOUSE if m = C.getmouse st = m.bstate - if ((st & C::BUTTON1_PRESSED) | (st & C::BUTTON1_RELEASED)) > 0 + if test_mouse(st, C::BUTTON1_PRESSED, C::BUTTON1_RELEASED) if m.y == cursor_y # TODO Wide-characters cursor = [0, [input.length, m.x - 2].min].max elsif m.x > 1 && m.y <= max_items vselect { |v| tv = max_items - m.y - 1 - if st & C::BUTTON1_RELEASED > 0 - if (st & C::BUTTON_SHIFT) > 0 + if test_mouse(st, C::BUTTON1_RELEASED) + if test_mouse(st, C::BUTTON_SHIFT) ch = :select elsif pmv == tv ch = ctrl(:m) @@ -804,9 +809,9 @@ class FZF tv } end - elsif ((st & 0x8000000) | (st & C::BUTTON2_PRESSED)) > 0 + elsif test_mouse(st, 0x8000000, C::BUTTON2_PRESSED) ch = C::KEY_DOWN - elsif (st & C::BUTTON4_PRESSED) > 0 + elsif test_mouse(st, C::BUTTON4_PRESSED) ch = C::KEY_UP end end @@ -820,26 +825,25 @@ class FZF else ch2 end - when Fixnum - # Ruby 1.8 - if (ch.chr rescue nil) && ch.chr =~ /[[:print:]]/ - ch = ch.chr - else - chs = [ch] - (num_unicode_bytes(ch) - 1).times do |i| - chs << C.getch - end + end - # UTF-8 TODO Ruby 1.8 - if chs.length > 1 + upd = actions.fetch(ch, proc { |ch| + if ch.is_a?(Fixnum) + # Ruby 1.8 + if (ch.chr rescue '') =~ /[[:print:]]/ + ch = ch.chr + elsif (nch = num_unicode_bytes(ch)) > 1 + chs = [ch] + (nch - 1).times do |i| + chs << C.getch + end + # UTF-8 TODO Ruby 1.8 ch = chs.pack('C*').force_encoding('UTF-8') end end - end - upd = actions.fetch(ch, proc { |chr| - if chr =~ /[[:print:]]/ - input.insert cursor, chr + if ch.is_a?(String) && ch =~ /[[:print:]]/ + input.insert cursor, ch cursor += 1 end }).call(ch) From d5fc03d867240277b6b8e7a9ab0745ceb7232b30 Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Thu, 30 Jan 2014 02:51:30 +0900 Subject: [PATCH 7/9] Update README --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 0faed38..aff96bd 100644 --- a/README.md +++ b/README.md @@ -64,6 +64,7 @@ usage: fzf [options] Environment variables FZF_DEFAULT_COMMAND Default command to use when input is tty FZF_DEFAULT_OPTS Defaults options. (e.g. "-x -m --sort 10000") + FZF_MOUSE_ENABLED Set to 0 to disable mouse ``` fzf will launch curses-based finder, read the list from STDIN, and write the @@ -103,6 +104,9 @@ The following readline key bindings should also work as expected. If you enable multi-select mode with `-m` option, you can select multiple items with TAB or Shift-TAB key. +You can also use mouse. Click on an item to select it or shift-click to select +multiple items. Use mouse wheel to move the cursor up and down. + ### Extended-search mode With `-x` or `--extended` option, fzf will start in "extended-search mode". From f2b2c022be999f02da92fc9bc97f4a3f61876509 Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Thu, 30 Jan 2014 14:47:51 +0900 Subject: [PATCH 8/9] Update gem version --- fzf.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fzf.gemspec b/fzf.gemspec index c61b9e9..c3cd8cd 100644 --- a/fzf.gemspec +++ b/fzf.gemspec @@ -1,7 +1,7 @@ # coding: utf-8 Gem::Specification.new do |spec| spec.name = 'fzf' - spec.version = '0.6.2' + spec.version = '0.7.0' spec.authors = ['Junegunn Choi'] spec.email = ['junegunn.c@gmail.com'] spec.description = %q{Fuzzy finder for your shell} From c7e86ad4f1061b0cad9f64a6c9ad26f386bc1168 Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Thu, 30 Jan 2014 15:41:44 +0900 Subject: [PATCH 9/9] Add --no-mouse option to replace FZF_MOUSE_ENABLED --- README.md | 2 +- fzf | 12 +++++++----- test/test_fzf.rb | 8 ++++++-- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index aff96bd..61e83fe 100644 --- a/README.md +++ b/README.md @@ -60,11 +60,11 @@ usage: fzf [options] -i Case-insensitive match (default: smart-case match) +i Case-sensitive match +c, --no-color Disable colors + --no-mouse Disable mouse Environment variables FZF_DEFAULT_COMMAND Default command to use when input is tty FZF_DEFAULT_OPTS Defaults options. (e.g. "-x -m --sort 10000") - FZF_MOUSE_ENABLED Set to 0 to disable mouse ``` fzf will launch curses-based finder, read the list from STDIN, and write the diff --git a/fzf b/fzf index f7795dd..7528aab 100755 --- a/fzf +++ b/fzf @@ -7,7 +7,7 @@ # / __/ / /_/ __/ # /_/ /___/_/ Fuzzy finder for your shell # -# Version: 0.7.0-devel (January 30, 2014) +# Version: 0.7.0 (January 30, 2014) # # Author: Junegunn Choi # URL: https://github.com/junegunn/fzf @@ -50,7 +50,7 @@ end class FZF C = Curses - attr_reader :rxflag, :sort, :color, :multi, :query, :extended + attr_reader :rxflag, :sort, :color, :mouse, :multi, :query, :extended class AtomicVar def initialize value @@ -81,6 +81,7 @@ class FZF @color = true @multi = false @extended = false + @mouse = true argv = if opts = ENV['FZF_DEFAULT_OPTS'] @@ -101,6 +102,7 @@ class FZF when '+i' then @rxflag = 0 when '-c', '--color' then @color = true when '+c', '--no-color' then @color = false + when '--no-mouse' then @mouse = false when '+s', '--no-sort' then @sort = nil when '-q', '--query' usage 1, 'query string required' unless query = argv.shift @@ -171,11 +173,11 @@ class FZF -i Case-insensitive match (default: smart-case match) +i Case-sensitive match +c, --no-color Disable colors + --no-mouse Disable mouse Environment variables FZF_DEFAULT_COMMAND Default command to use when input is tty - FZF_DEFAULT_OPTS Defaults options. (e.g. "-x -m --sort 10000") - FZF_MOUSE_ENABLED Set to 0 to disable mouse] + $/ + $/ + FZF_DEFAULT_OPTS Defaults options. (e.g. "-x -m --sort 10000")] + $/ + $/ exit x end @@ -472,7 +474,7 @@ class FZF def init_screen C.init_screen - unless ENV.fetch('FZF_MOUSE_ENABLED', '1') == '0' + if @mouse C.mouseinterval 0 C.mousemask C::ALL_MOUSE_EVENTS end diff --git a/test/test_fzf.rb b/test/test_fzf.rb index 7310735..3f61f0f 100644 --- a/test/test_fzf.rb +++ b/test/test_fzf.rb @@ -20,6 +20,7 @@ class TestFZF < MiniTest::Unit::TestCase assert_equal false, fzf.multi assert_equal true, fzf.color assert_equal nil, fzf.rxflag + assert_equal true, fzf.mouse end def test_environment_variables @@ -28,7 +29,7 @@ class TestFZF < MiniTest::Unit::TestCase fzf = FZF.new [] assert_equal 20000, fzf.sort - ENV['FZF_DEFAULT_OPTS'] = '-x -m -s 10000 -q " hello world " +c' + ENV['FZF_DEFAULT_OPTS'] = '-x -m -s 10000 -q " hello world " +c --no-mouse' fzf = FZF.new [] assert_equal 10000, fzf.sort assert_equal ' hello world ', @@ -36,14 +37,16 @@ class TestFZF < MiniTest::Unit::TestCase assert_equal true, fzf.extended assert_equal true, fzf.multi assert_equal false, fzf.color + assert_equal false, fzf.mouse end def test_option_parser # Long opts - fzf = FZF.new %w[--sort=2000 --no-color --multi +i --query hello --extended] + fzf = FZF.new %w[--sort=2000 --no-color --multi +i --query hello --extended --no-mouse] assert_equal 2000, fzf.sort assert_equal true, fzf.multi assert_equal false, fzf.color + assert_equal false, fzf.mouse assert_equal 0, fzf.rxflag assert_equal 'hello', fzf.query.get assert_equal true, fzf.extended @@ -53,6 +56,7 @@ class TestFZF < MiniTest::Unit::TestCase assert_equal nil, fzf.sort assert_equal false, fzf.multi assert_equal true, fzf.color + assert_equal true, fzf.mouse assert_equal 1, fzf.rxflag assert_equal 'hello', fzf.query.get assert_equal false, fzf.extended