From df5fb858aa55448cd6a522fd66b0a0c577085787 Mon Sep 17 00:00:00 2001 From: Eric Freese Date: Tue, 15 May 2018 13:55:37 -0600 Subject: [PATCH] Destroy old pty even if it's no longer running (#249) For unknown reasons, the pty will occasionally quit running. In these cases, we still want to remove it so that a fresh one can be created. We don't actually need this check because error messages from `zle` and `zpty` are redirected to /dev/null. One sure way to kill all currently running pty's is to run `exit` in a subshell. Even without zsh-autosuggestions loaded, the following works: % zmodload zsh/zpty % zpty -b foo cat % zpty -b bar cat % zpty (31689) bar: cat (31666) foo: cat % $(exit) % zpty (finished) bar: cat (finished) foo: cat --- spec/async_spec.rb | 10 ++++++++++ src/async.zsh | 10 ++++------ zsh-autosuggestions.zsh | 10 ++++------ 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/spec/async_spec.rb b/spec/async_spec.rb index 9405fb2..0bcbaa1 100644 --- a/spec/async_spec.rb +++ b/spec/async_spec.rb @@ -26,6 +26,16 @@ context 'with asynchronous suggestions enabled' do end end end + + describe 'exiting a subshell' do + it 'should not cause error messages to be printed' do + session.run_command('$(exit)') + + sleep 1 + + expect(session.content).to eq('$(exit)') + end + end end diff --git a/src/async.zsh b/src/async.zsh index de55e1d..9a0cfaa 100644 --- a/src/async.zsh +++ b/src/async.zsh @@ -83,13 +83,11 @@ _zsh_autosuggest_async_pty_create() { } _zsh_autosuggest_async_pty_destroy() { - if zpty -t $ZSH_AUTOSUGGEST_ASYNC_PTY_NAME &>/dev/null; then - # Remove the input handler - zle -F $_ZSH_AUTOSUGGEST_PTY_FD &>/dev/null + # Remove the input handler + zle -F $_ZSH_AUTOSUGGEST_PTY_FD &>/dev/null - # Destroy the zpty - zpty -d $ZSH_AUTOSUGGEST_ASYNC_PTY_NAME &>/dev/null - fi + # Destroy the zpty + zpty -d $ZSH_AUTOSUGGEST_ASYNC_PTY_NAME &>/dev/null } _zsh_autosuggest_async_pty_recreate() { diff --git a/zsh-autosuggestions.zsh b/zsh-autosuggestions.zsh index 7f6e7de..3443469 100644 --- a/zsh-autosuggestions.zsh +++ b/zsh-autosuggestions.zsh @@ -661,13 +661,11 @@ _zsh_autosuggest_async_pty_create() { } _zsh_autosuggest_async_pty_destroy() { - if zpty -t $ZSH_AUTOSUGGEST_ASYNC_PTY_NAME &>/dev/null; then - # Remove the input handler - zle -F $_ZSH_AUTOSUGGEST_PTY_FD &>/dev/null + # Remove the input handler + zle -F $_ZSH_AUTOSUGGEST_PTY_FD &>/dev/null - # Destroy the zpty - zpty -d $ZSH_AUTOSUGGEST_ASYNC_PTY_NAME &>/dev/null - fi + # Destroy the zpty + zpty -d $ZSH_AUTOSUGGEST_ASYNC_PTY_NAME &>/dev/null } _zsh_autosuggest_async_pty_recreate() {