From 00190677d421b4833488befd7d96b22d2014f32d Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Tue, 23 Dec 2014 12:22:19 +0900 Subject: [PATCH] Add support for ALT-D and ALT-BS key bindings https://github.com/junegunn/fzf/issues/111#issuecomment-67832143 --- fzf | 29 +++++++++++++++++++++++------ test/test_fzf.rb | 25 +++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 6 deletions(-) diff --git a/fzf b/fzf index c5fcace..cacba4a 100755 --- a/fzf +++ b/fzf @@ -7,7 +7,7 @@ # / __/ / /_/ __/ # /_/ /___/_/ Fuzzy finder for your shell # -# Version: 0.8.8 (Nov 4, 2014) +# Version: 0.8.9 (Dec 23, 2014) # # Author: Junegunn Choi # URL: https://github.com/junegunn/fzf @@ -955,8 +955,10 @@ class FZF get_mouse end when 'b', 98 then :alt_b + when 'd', 100 then :alt_d when 'f', 102 then :alt_f when :esc then :esc + when 127 then ctrl(:w) else next end if ord == 27 @@ -1013,6 +1015,11 @@ class FZF mouse_event = MouseEvent.new backword = proc { cursor = (input[0, cursor].rindex(/\s\S/) || -1) + 1 + nil + } + forward = proc { + cursor += (input[cursor..-1].index(/(\S\s)|(.$)/) || -1) + 1 + nil } actions = { :esc => proc { exit 1 }, @@ -1039,8 +1046,10 @@ class FZF ctrl(:w) => proc { pcursor = cursor backword.call - yanked = input[cursor...pcursor] if pcursor > cursor - input = input[0...cursor] + input[pcursor..-1] + if pcursor > cursor + yanked = input[cursor...pcursor] + input = input[0...cursor] + input[pcursor..-1] + end }, ctrl(:y) => proc { actions[:default].call yanked }, ctrl(:h) => proc { input[cursor -= 1] = '' if cursor > 0 }, @@ -1066,10 +1075,18 @@ class FZF :del => proc { input[cursor] = '' if input.length > cursor }, :pgup => proc { vselect { |v| v + @rev_dir * (max_items - 1) } }, :pgdn => proc { vselect { |v| v - @rev_dir * (max_items - 1) } }, - :alt_b => proc { backword.call; nil }, + :alt_b => proc { backword.call }, + :alt_d => proc { + pcursor = cursor + forward.call + if cursor > pcursor + yanked = input[pcursor...cursor] + input = input[0...pcursor] + input[cursor..-1] + cursor = pcursor + end + }, :alt_f => proc { - cursor += (input[cursor..-1].index(/(\S\s)|(.$)/) || -1) + 1 - nil + forward.call }, :default => proc { |val| case val diff --git a/test/test_fzf.rb b/test/test_fzf.rb index 2bb7dce..f8a06cf 100644 --- a/test/test_fzf.rb +++ b/test/test_fzf.rb @@ -50,6 +50,7 @@ class MockTTY @buffer << str @condv.broadcast end + self end end @@ -805,6 +806,30 @@ class TestFZF < MiniTest::Unit::TestCase tty << "\e[Z\e[Z" tty << "\r" end + + # ALT-D + assert_fzf_output %w[--print-query], "", "hello baby = world" do |tty| + tty << "hello world baby" + tty << alt(:b) << alt(:b) << alt(:d) + tty << ctrl(:e) << " = " << ctrl(:y) + tty << "\r" + end + + # ALT-BACKSPACE + assert_fzf_output %w[--print-query], "", "hello baby = world " do |tty| + tty << "hello world baby" + tty << alt(:b) << alt(127.chr) + tty << ctrl(:e) << " = " << ctrl(:y) + tty << "\r" + end + end + + def alt chr + "\e#{chr}" + end + + def ctrl char + char.to_s.ord - 'a'.ord + 1 end end