diff --git a/spec/integrations/bracketed_paste_magic_spec.rb b/spec/integrations/bracketed_paste_magic_spec.rb new file mode 100644 index 0000000..f01b0e0 --- /dev/null +++ b/spec/integrations/bracketed_paste_magic_spec.rb @@ -0,0 +1,36 @@ +describe 'pasting using bracketed-paste-magic' do + let(:before_sourcing) do + -> do + session. + run_command('autoload -Uz bracketed-paste-magic'). + run_command('zle -N bracketed-paste bracketed-paste-magic') + end + end + + context 'with suggestions disabled while pasting' do + before do + session. + run_command('bpm_init() { zle autosuggest-disable }'). + run_command('bpm_finish() { zle autosuggest-enable }'). + run_command('zstyle :bracketed-paste-magic paste-init bpm_init'). + run_command('zstyle :bracketed-paste-magic paste-finish bpm_finish') + end + + it 'does not show an incorrect suggestion' do + with_history('echo hello') do + session.paste_string("echo #{'a' * 60}") + sleep 1 + expect(session.content).to eq("echo #{'a' * 60}") + end + end + + it 'shows a suggestion after a non-modifying keystroke' do + with_history('echo hello') do + session.paste_string('echo') + sleep 1 + session.send_keys('left') + wait_for { session.content }.to eq('echo hello') + end + end + end +end diff --git a/spec/terminal_session.rb b/spec/terminal_session.rb index 3f8ca69..82705d3 100644 --- a/spec/terminal_session.rb +++ b/spec/terminal_session.rb @@ -41,6 +41,13 @@ class TerminalSession self end + def paste_string(str) + tmux_command("set-buffer -- '#{str}'") + tmux_command("paste-buffer -dpr -t 0") + + self + end + def content(esc_seqs: false) cmd = 'capture-pane -p -t 0' cmd += ' -e' if esc_seqs diff --git a/spec/widgets/enable_spec.rb b/spec/widgets/enable_spec.rb index 0322406..3ad35a8 100644 --- a/spec/widgets/enable_spec.rb +++ b/spec/widgets/enable_spec.rb @@ -6,16 +6,37 @@ describe 'the `autosuggest-enable` widget' do end it 'enables suggestions and fetches a suggestion' do - with_history('echo world', 'echo hello') do - session.send_string('echo') + with_history('echo hello') do + session.send_string('e') sleep 1 - expect(session.content).to eq('echo') + expect(session.content).to eq('e') session.send_keys('C-b') + session.send_string('c') wait_for { session.content }.to eq('echo hello') + end + end - session.send_string(' w') - wait_for { session.content }.to eq('echo world') + context 'invoked on an empty buffer' do + it 'does not fetch a suggestion' do + with_history('echo hello') do + session.send_keys('C-b') + sleep 1 + expect(session.content).to eq('') + end + end + end + + context 'invoked on a non-empty buffer' do + it 'fetches a suggestion' do + with_history('echo hello') do + session.send_string('e') + sleep 1 + expect(session.content).to eq('e') + + session.send_keys('C-b') + wait_for { session.content }.to eq('echo hello') + end end end end diff --git a/src/widgets.zsh b/src/widgets.zsh index 2bcedc4..aa3f248 100644 --- a/src/widgets.zsh +++ b/src/widgets.zsh @@ -12,7 +12,10 @@ _zsh_autosuggest_disable() { # Enable suggestions _zsh_autosuggest_enable() { unset _ZSH_AUTOSUGGEST_DISABLED - _zsh_autosuggest_fetch + + if [ $#BUFFER -gt 0 ]; then + _zsh_autosuggest_fetch + fi } # Toggle suggestions (enable/disable) diff --git a/zsh-autosuggestions.zsh b/zsh-autosuggestions.zsh index 96b69a9..55d23b7 100644 --- a/zsh-autosuggestions.zsh +++ b/zsh-autosuggestions.zsh @@ -290,7 +290,10 @@ _zsh_autosuggest_disable() { # Enable suggestions _zsh_autosuggest_enable() { unset _ZSH_AUTOSUGGEST_DISABLED - _zsh_autosuggest_fetch + + if [ $#BUFFER -gt 0 ]; then + _zsh_autosuggest_fetch + fi } # Toggle suggestions (enable/disable)