diff options
| author | bitterfox <bitterfoxc@gmail.com> | 2021-02-28 21:01:03 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-02-28 21:01:03 +0900 |
| commit | 4f9a7f8c879ef625f3bec5946df9e7fe5768f9dd (patch) | |
| tree | 1fe477b287ce4bbf691632ef22d1c85cf462a07b | |
| parent | bb0502ff4429580e363be708ff301c35479144e3 (diff) | |
| download | fzf-4f9a7f8c879ef625f3bec5946df9e7fe5768f9dd.tar.gz | |
Don't exit fzf by SIGINT while executing command (#2375)
Fix #2374
Co-authored-by: Junegunn Choi <junegunn.c@gmail.com>
| -rw-r--r-- | src/terminal.go | 16 | ||||
| -rwxr-xr-x | test/test_go.rb | 11 |
2 files changed, 24 insertions, 3 deletions
diff --git a/src/terminal.go b/src/terminal.go index 2fcaa697..93ba21ba 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 a39cb5f6..9ac1be76 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 |
