diff --git a/src/terminal.go b/src/terminal.go index 2fcaa69..93ba21b 100644 --- a/src/terminal.go +++ b/src/terminal.go @@ -157,6 +157,7 @@ type Terminal struct { slab *util.Slab theme *tui.ColorTheme tui tui.Renderer + executing *util.AtomicBool } type selectedItem struct { @@ -525,7 +526,8 @@ func NewTerminal(opts *Options, eventBox *util.EventBox) *Terminal { startChan: make(chan bool, 1), killChan: make(chan int), tui: renderer, - initFunc: func() { renderer.Init() }} + initFunc: func() { renderer.Init() }, + executing: util.NewAtomicBool(false)} t.prompt, t.promptLen = t.parsePrompt(opts.Prompt) t.pointer, t.pointerLen = t.processTabs([]rune(opts.Pointer), 0) t.marker, t.markerLen = t.processTabs([]rune(opts.Marker), 0) @@ -1713,13 +1715,17 @@ func (t *Terminal) executeCommand(template string, forcePlus bool, background bo cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr t.tui.Pause(true) + t.executing.Set(true) cmd.Run() + t.executing.Set(false) t.tui.Resume(true, false) t.redraw() t.refresh() } else { t.tui.Pause(false) + t.executing.Set(true) cmd.Run() + t.executing.Set(false) t.tui.Resume(false, false) } cleanTemporaryFiles() @@ -1837,8 +1843,12 @@ func (t *Terminal) Loop() { intChan := make(chan os.Signal, 1) signal.Notify(intChan, os.Interrupt, syscall.SIGTERM) go func() { - <-intChan - t.reqBox.Set(reqQuit, nil) + for s := range intChan { + // Don't quit by SIGINT while executing because it should be for the executing command and not for fzf itself + if !(s == os.Interrupt && t.executing.Get()) { + t.reqBox.Set(reqQuit, nil) + } + } }() contChan := make(chan os.Signal, 1) diff --git a/test/test_go.rb b/test/test_go.rb index a39cb5f..9ac1be7 100755 --- a/test/test_go.rb +++ b/test/test_go.rb @@ -1911,6 +1911,17 @@ class TestGoFZF < TestBase tmux.send_keys :Down tmux.until { |lines| assert_equal 2, lines.select_count } end + + def test_interrupt_execute + tmux.send_keys "seq 100 | #{FZF} --bind 'ctrl-l:execute:echo executing {}; sleep 100'", :Enter + tmux.until { |lines| assert_equal 100, lines.item_count } + tmux.send_keys 'C-l' + tmux.until { |lines| assert lines.any_include?('executing 1') } + tmux.send_keys 'C-c' + tmux.until { |lines| assert_equal 100, lines.item_count } + tmux.send_keys 99 + tmux.until { |lines| assert_equal 1, lines.match_count } + end end module TestShell