From d6334ded0b91db2e85e95c39f9d87bbda33c013d Mon Sep 17 00:00:00 2001
From: muhammadsohail <mhsohail56@gmail.com>
Date: Sat, 20 May 2023 16:51:23 -0400
Subject: [PATCH] Adding support for ZSH_AUTOSUGGEST_BUFFER_MIN_SIZE to disable
 suggestions on small buffers

---
 README.md                            |  6 ++---
 spec/options/buffer_max_size_spec.rb |  5 ++++-
 spec/options/buffer_min_size_spec.rb | 33 ++++++++++++++++++++++++++++
 src/widgets.zsh                      |  5 ++---
 zsh-autosuggestions.zsh              | 11 +++++-----
 5 files changed, 47 insertions(+), 13 deletions(-)
 create mode 100644 spec/options/buffer_min_size_spec.rb

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