branch: elpa/aidermacs
commit e391bbe222fc7a9d63546a058067321137559880
Author: Kang Tu <[email protected]>
Commit: GitHub <[email protected]>
Feat: Add function to explain code in selected region
* feat: Add function to explain code in selected region
* add aider-region-explain, support send large text (> 1024 chars) to
aider buffer
* better comment
---------
Co-authored-by: Kang Tu <[email protected]>
---
README.org | 11 ++++++++---
aider.el | 44 ++++++++++++++++++++++++++++++++++++++++----
transient_menu.png | Bin 121113 -> 58345 bytes
3 files changed, 48 insertions(+), 7 deletions(-)
diff --git a/README.org b/README.org
index 4701442037..e8ac7950b6 100644
--- a/README.org
+++ b/README.org
@@ -17,9 +17,14 @@
- Git Repository-Specific aider Sessions in Emacs: Automatically identify the
Git repository of the current file and create a new aider session for it.
Multiple aider sessions can exist for different Git repositories.
-- Batch add files from dired buffer (aider-batch-add-dired-marked-files): Add
multiple Dired marked files to the Aider buffer. These files can be searched
from repo with aider-repo-find-name-dired command
-
-- Region-Based Refactor Support (aider-region-refactor): You can select a
region (e.g., a code block) in a file and ask aider to refactor it.
+- More ways to add files to aider buffer
+ - Add current buffer file: (aider-add-current-file)
+ - Add all buffers in current window: (aider-add-files-in-current-window)
+ - Batch add files from dired buffer (aider-batch-add-dired-marked-files):
Add multiple Dired marked files to the Aider buffer.
+
+- Region-Based Explain / Refactor Support
+ - Explain: (aider-region-explain): You can select a region (e.g., a code
block) in a file and ask aider to explain it.
+ - Refactor: (aider-region-refactor): Ask aider to refactor it given your
input instruction
- And More: Add your own Elisp functions to support your use case. You can
certainly ask aider / aider.el to do that.
diff --git a/aider.el b/aider.el
index 94b8e39ec5..e8ef5a403f 100644
--- a/aider.el
+++ b/aider.el
@@ -36,7 +36,8 @@
This function can be customized or redefined by the user."
(let* ((input (read-string prompt initial-input))
(processed-input (replace-regexp-in-string "\n" "\\\\n" input)))
- (concat processed-input "\n")))
+ processed-input
+ ))
(defalias 'aider-read-string 'aider-plain-read-string)
@@ -62,12 +63,13 @@ This function can be customized or redefined by the user."
]
["Code change"
("c" "Code Change" aider-code-change)
- ("r" "Region Code Refactor" aider-region-refactor)
+ ("r" "Refactor Code in Selected Region" aider-region-refactor)
("u" "Undo Last Change" aider-undo-last-change)
]
["Discussion"
("q" "Ask Question" aider-ask-question)
("t" "Architect Discussion" aider-architect-discussion)
+ ("e" "Explain Code in Selected Region" aider-region-explain)
("d" "Debug Exception" aider-debug-exception)
]
["Other"
@@ -130,6 +132,20 @@ If not in a git repository, an error is raised."
(interactive)
(aider--send-command "/reset"))
+;; Function to send large text (> 1024 chars) to the Aider buffer
+(defun comint-send-large-string (buffer text)
+ "Send large TEXT to the comint buffer in chunks of 1000 characters."
+ (let ((chunk-size 1000)
+ (pos 0)
+ (process (get-buffer-process buffer)))
+ (while (< pos (length text))
+ (process-send-string
+ process
+ (substring text pos (min (+ pos chunk-size) (length text))))
+ (sleep-for 0.1)
+ (message "Sent command to aider buffer: %s" (substring text pos (min (+
pos chunk-size) (length text))))
+ (setq pos (+ pos chunk-size)))))
+
;; Shared helper function to send commands to corresponding aider buffer
(defun aider--send-command (command &optional switch-to-buffer)
"Send COMMAND to the corresponding aider comint buffer after performing
necessary checks.
@@ -144,9 +160,9 @@ COMMAND should be a string representing the command to
send."
(unless (string-suffix-p "\n" command)
(setq command (concat command "\n")))
;; Send the command to the aider process
- (comint-send-string aider-buffer command)
+ (comint-send-large-string aider-buffer command)
;; Provide feedback to the user
- (message "Sent command to aider buffer: %s" (string-trim
command))
+ ;; (message "Sent command to aider buffer: %s" (string-trim
command))
(when switch-to-buffer
(aider-switch-to-buffer)))
(message "No active process found in buffer %s."
(aider-buffer-name))))
@@ -237,6 +253,26 @@ The command will be formatted as \"/architect \" followed
by the user command an
)
(message "No region selected.")))
+;; New function to explain the code in the selected region
+(defun aider-region-explain ()
+ "Get a command from the user and send it to the corresponding aider comint
buffer based on the selected region.
+The command will be formatted as \"/ask \" followed by the text from the
selected region."
+ (interactive)
+ (if (use-region-p)
+ (let* ((region-text (buffer-substring-no-properties (region-beginning)
(region-end)))
+ (function-name (which-function))
+ (processed-region-text (replace-regexp-in-string "\n" "\\\\n"
region-text))
+ (command (if function-name
+ (format "/ask in function %s, explain the following
code block: %s"
+ function-name
+ processed-region-text)
+ (format "/ask explain the following code block: %s"
+ processed-region-text)
+ )))
+ (aider-add-current-file)
+ (aider--send-command command t))
+ (message "No region selected.")))
+
(defun aider-send-command-with-prefix (prefix command)
"Send COMMAND to the Aider buffer prefixed with PREFIX."
(aider-add-current-file)
diff --git a/transient_menu.png b/transient_menu.png
index 22610cf5d0..dfd15846b0 100644
Binary files a/transient_menu.png and b/transient_menu.png differ