diff --git a/README.md b/README.md index 3ee17f3..4a90866 100644 --- a/README.md +++ b/README.md @@ -74,10 +74,10 @@ Widgets that modify the buffer and are not found in any of these arrays will fet **Note:** A widget shouldn't belong to more than one of the above arrays. -### Disabling suggestion for large buffers +### Disabling suggestion for small or large buffers -Set `ZSH_AUTOSUGGEST_BUFFER_MAX_SIZE` to an integer value to disable autosuggestion for large buffers. The default is unset, which means that autosuggestion will be tried for any buffer size. Recommended value is 20. -This can be useful when pasting large amount of text in the terminal, to avoid triggering autosuggestion for strings that are too long. +Set `ZSH_AUTOSUGGEST_BUFFER_MAX_SIZE` or `ZSH_AUTOSUGGEST_BUFFER_MIN_SIZE` to an integer value to disable autosuggestion for small or larger buffers. The default for both is unset, which means that autosuggestion will be tried for any buffer size. Recommended range is [5, 20]. +This can be useful when pasting large amount of text in the terminal, to avoid triggering autosuggestion for strings that are too long, or for irrelevant suggestions on smaller buffers. ### Asynchronous Mode diff --git a/spec/options/buffer_max_size_spec.rb b/spec/options/buffer_max_size_spec.rb index 29ca8bc..f61cc25 100644 --- a/spec/options/buffer_max_size_spec.rb +++ b/spec/options/buffer_max_size_spec.rb @@ -25,6 +25,9 @@ describe 'a suggestion' do wait_for { session.content }.to eq(long_command) end - it 'is not provided when the buffer is longer than the specified length' + it 'is not provided when the buffer is longer than the specified length' do + session.send_string(long_command[0...(buffer_max_size + 1)]) + wait_for { session.content }.to eq(long_command[0...(buffer_max_size + 1)]) + end end end diff --git a/spec/options/buffer_min_size_spec.rb b/spec/options/buffer_min_size_spec.rb new file mode 100644 index 0000000..811c7cc --- /dev/null +++ b/spec/options/buffer_min_size_spec.rb @@ -0,0 +1,33 @@ +describe 'a suggestion' do + let(:term_opts) { { width: 200 } } + let(:command) { "echo foobar" } + + around do |example| + with_history(command) { example.run } + end + + it 'is provided for any buffer length' do + session.send_string(command[0...-1]) + wait_for { session.content }.to eq(command) + end + + context 'when ZSH_AUTOSUGGEST_BUFFER_MIN_SIZE is specified' do + let(:buffer_min_size) { 5 } + let(:options) { ["ZSH_AUTOSUGGEST_BUFFER_MIN_SIZE=#{buffer_min_size}"] } + + it 'is provided when the buffer is longer than the specified length' do + session.send_string(command[0...(buffer_min_size + 1)]) + wait_for { session.content }.to eq(command) + end + + it 'is provided when the buffer is equal to the specified length' do + session.send_string(command[0...(buffer_min_size)]) + wait_for { session.content }.to eq(command) + end + + it 'is not provided when the buffer is shorter than the specified length' do + session.send_string(command[0...(buffer_min_size - 1)]) + wait_for { session.content }.to eq(command[0...(buffer_min_size - 1)]) + end + end +end diff --git a/src/widgets.zsh b/src/widgets.zsh index 7562897..fa31499 100644 --- a/src/widgets.zsh +++ b/src/widgets.zsh @@ -73,10 +73,9 @@ _zsh_autosuggest_modify() { fi # Get a new suggestion if the buffer is not empty after modification - if (( $#BUFFER > 0 )); then - if [[ -z "$ZSH_AUTOSUGGEST_BUFFER_MAX_SIZE" ]] || (( $#BUFFER <= $ZSH_AUTOSUGGEST_BUFFER_MAX_SIZE )); then + if ([[ -z "$ZSH_AUTOSUGGEST_BUFFER_MIN_SIZE" ]] || (( $#BUFFER >= $ZSH_AUTOSUGGEST_BUFFER_MIN_SIZE ))) && \ + ([[ -z "$ZSH_AUTOSUGGEST_BUFFER_MAX_SIZE" ]] || (( $#BUFFER <= $ZSH_AUTOSUGGEST_BUFFER_MAX_SIZE ))); then _zsh_autosuggest_fetch - fi fi return $retval diff --git a/zsh-autosuggestions.zsh b/zsh-autosuggestions.zsh index 10aff06..96f1ad2 100644 --- a/zsh-autosuggestions.zsh +++ b/zsh-autosuggestions.zsh @@ -3,7 +3,7 @@ # v0.7.0 # Copyright (c) 2013 Thiago de Arruda # Copyright (c) 2016-2021 Eric Freese -# +# # Permission is hereby granted, free of charge, to any person # obtaining a copy of this software and associated documentation # files (the "Software"), to deal in the Software without @@ -12,10 +12,10 @@ # copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following # conditions: -# +# # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. -# +# # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES # OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND @@ -337,10 +337,9 @@ _zsh_autosuggest_modify() { fi # Get a new suggestion if the buffer is not empty after modification - if (( $#BUFFER > 0 )); then - if [[ -z "$ZSH_AUTOSUGGEST_BUFFER_MAX_SIZE" ]] || (( $#BUFFER <= $ZSH_AUTOSUGGEST_BUFFER_MAX_SIZE )); then + if ([[ -z "$ZSH_AUTOSUGGEST_BUFFER_MIN_SIZE" ]] || (( $#BUFFER >= $ZSH_AUTOSUGGEST_BUFFER_MIN_SIZE ))) && \ + ([[ -z "$ZSH_AUTOSUGGEST_BUFFER_MAX_SIZE" ]] || (( $#BUFFER <= $ZSH_AUTOSUGGEST_BUFFER_MAX_SIZE ))); then _zsh_autosuggest_fetch - fi fi return $retval