diff --git a/spec/integrations/client_zpty_spec.rb b/spec/integrations/client_zpty_spec.rb index 8f1550e..e364759 100644 --- a/spec/integrations/client_zpty_spec.rb +++ b/spec/integrations/client_zpty_spec.rb @@ -1,10 +1,23 @@ describe 'a running zpty command' do let(:before_sourcing) { -> { session.run_command('zmodload zsh/zpty && zpty -b kitty cat') } } - it 'is not affected by running zsh-autosuggestions' do - sleep 1 # Give a little time for precmd hooks to run - session.run_command('zpty -t kitty; echo $?') + context 'when sourcing the plugin' do + it 'is not affected' do + sleep 1 # Give a little time for precmd hooks to run + session.run_command('zpty -t kitty; echo $?') - wait_for { session.content }.to end_with("\n0") + wait_for { session.content }.to end_with("\n0") + end + end + + context 'when using `completion` strategy' do + let(:options) { ["ZSH_AUTOSUGGEST_STRATEGY=completion"] } + + it 'is not affected' do + session.send_keys('a').send_keys('C-h') + session.run_command('zpty -t kitty; echo $?') + + wait_for { session.content }.to end_with("\n0") + end end end diff --git a/src/strategies/completion.zsh b/src/strategies/completion.zsh index e8aac6c..6517444 100644 --- a/src/strategies/completion.zsh +++ b/src/strategies/completion.zsh @@ -9,6 +9,16 @@ _zsh_autosuggest_capture_setup() { zmodload zsh/zutil # For `zparseopts` + # There is a bug in zpty module (fixed in zsh/master) by which a + # zpty that exits will kill all zpty processes that were forked + # before it. Here we set up a zsh exit hook to SIGKILL the zpty + # process immediately, before it has a chance to kill any other + # zpty processes. + zshexit() { + kill -KILL $$ + sleep 1 # Block for long enough for the signal to come through + } + # Never group stuff! zstyle ':completion:*' list-grouped false diff --git a/zsh-autosuggestions.zsh b/zsh-autosuggestions.zsh index 40f6f66..644bacf 100644 --- a/zsh-autosuggestions.zsh +++ b/zsh-autosuggestions.zsh @@ -506,6 +506,16 @@ zle -N autosuggest-toggle _zsh_autosuggest_widget_toggle _zsh_autosuggest_capture_setup() { zmodload zsh/zutil # For `zparseopts` + # There is a bug in zpty module (fixed in zsh/master) by which a + # zpty that exits will kill all zpty processes that were forked + # before it. Here we set up a zsh exit hook to SIGKILL the zpty + # process immediately, before it has a chance to kill any other + # zpty processes. + zshexit() { + kill -KILL $$ + sleep 1 # Block for long enough for the signal to come through + } + # Never group stuff! zstyle ':completion:*' list-grouped false