branch: elpa/aidermacs
commit 56e83fd85154ba0f7b90dfd878dde833ac1a0f2d
Author: tninja (aider) <[email protected]>
Commit: tninja <[email protected]>
feat: Refactor aider-helm.el to make it more generic and reusable
refactor: Simplify helm-based input with history
feat: Simplify helm-read-string-with-history by removing global history
variable
fix: remove unused optional parameters from helm-read-string-with-history
and aider-helm-read-string
feat: move expand-file-name logic inside helm-read-string-with-history
fix: Remove unnecessary empty line in aider-helm.el
fix: deduplicate history entries when loading from file
fix the filename
---
aider-helm.el | 74 ++++++++++++++++++++++-------------------------------------
1 file changed, 28 insertions(+), 46 deletions(-)
diff --git a/aider-helm.el b/aider-helm.el
index 4b8b998139..b4758dbc01 100644
--- a/aider-helm.el
+++ b/aider-helm.el
@@ -1,57 +1,39 @@
;; optional helm based completion, need to be manually loaded when needed
-;; helm based aider input
-
(require 'helm)
(require 'cl-lib) ; For `cl-subseq`
-(defvar aider-helm-read-string-history nil
- "History list for `aider-helm-read-string` inputs.")
-
-(defvar aider-helm-read-string-history-file
- (expand-file-name "aider-helm-read-string-history.el" user-emacs-directory)
- "File to save `aider-helm-read-string-history`.")
-
-(defvar aider-helm-read-string-history-max 1000
- "Maximum number of entries to keep in `aider-helm-read-string-history`.")
-
-(defun save-aider-helm-read-string-history ()
- "Save `aider-helm-read-string-history` to a file."
- ;; Trim history to maximum size
- (setq aider-helm-read-string-history
- (cl-subseq aider-helm-read-string-history
- 0 (min (length aider-helm-read-string-history)
- aider-helm-read-string-history-max)))
- ;; Save to file
- (with-temp-file aider-helm-read-string-history-file
- (insert (prin1-to-string aider-helm-read-string-history))))
-
-(defun load-aider-helm-read-string-history ()
- "Load `aider-helm-read-string-history` from a file."
- (when (file-exists-p aider-helm-read-string-history-file)
- (with-temp-buffer
- (insert-file-contents aider-helm-read-string-history-file)
- (setq aider-helm-read-string-history (read (buffer-string))))))
-
-(add-hook 'kill-emacs-hook 'save-aider-helm-read-string-history)
-(load-aider-helm-read-string-history)
-
-(defun aider-helm-read-string (prompt &optional initial-input default-value)
- "Read a string with Helm completion, showing historical inputs."
- (let* ((input (helm-comp-read
- prompt
- aider-helm-read-string-history
- :must-match nil
- :name "Helm Read String"
- :history 'aider-helm-read-string-history
- :initial-input initial-input
- :default default-value
- :fuzzy t))) ;; fuzzy match
- ;; Add input to history if it's not empty
+(defun helm-read-string-with-history (prompt history-file-name)
+ "Read a string with Helm completion using specified history file.
+PROMPT is the prompt string.
+HISTORY-FILE-NAME is the base name for history file."
+ ;; Load history from file
+ (let* ((history-file (expand-file-name history-file-name
user-emacs-directory))
+ (history (when (file-exists-p history-file)
+ (with-temp-buffer
+ (insert-file-contents history-file)
+ (delete-dups (read (buffer-string))))))
+ ;; Read input with helm
+ (input (helm-comp-read
+ prompt
+ history
+ :must-match nil
+ :name "Helm Read String"
+ :fuzzy t)))
+ ;; Add to history if non-empty and save
(unless (string-empty-p input)
- (add-to-history 'aider-helm-read-string-history input))
+ (push input history)
+ (with-temp-file history-file
+ (let ((history-entries (cl-subseq history
+ 0 (min (length history)
+ 1000)))) ; Keep last 1000
entries
+ (insert (prin1-to-string history-entries)))))
input))
+(defun aider-helm-read-string (prompt)
+ "Read a string with Helm completion for aider, showing historical inputs."
+ (helm-read-string-with-history prompt "aider-helm-read-string-history.el"))
+
(defalias 'aider-read-string 'aider-helm-read-string)
;; how to copy candidate to mini-buffer? C-c C-y:
https://emacs.stackexchange.com/questions/47588/in-a-helm-prompt-how-do-i-copy-a-candidate-for-editing