[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[nongnu] elpa/aidermacs a88a79cc9f 375/466: Improve aidermacs--vterm-che
From: |
ELPA Syncer |
Subject: |
[nongnu] elpa/aidermacs a88a79cc9f 375/466: Improve aidermacs--vterm-check-finish-sequence-repeated |
Date: |
Sat, 15 Mar 2025 19:18:41 -0400 (EDT) |
branch: elpa/aidermacs
commit a88a79cc9ff2b1452b88bfb344bdf3ee57cf676e
Author: Mingde (Matthew) Zeng <matthewzmd@posteo.net>
Commit: Mingde (Matthew) Zeng <matthewzmd@posteo.net>
Improve aidermacs--vterm-check-finish-sequence-repeated
Addresses #41
---
aidermacs-backend-vterm.el | 64 +++++++++++++++++++++++++++-------------------
1 file changed, 37 insertions(+), 27 deletions(-)
diff --git a/aidermacs-backend-vterm.el b/aidermacs-backend-vterm.el
index ec7e376adc..71bdaa13e0 100644
--- a/aidermacs-backend-vterm.el
+++ b/aidermacs-backend-vterm.el
@@ -15,6 +15,7 @@
;;; Code:
(require 'vterm nil 'noerror)
+(require 'cl-lib)
;; we want to ensure these two variables are dynamic binding
(defvar vterm-shell)
@@ -32,6 +33,14 @@
(defvar-local aidermacs--vterm-active-timer nil
"Store the active timer for vterm output processing.")
+(defvar-local aidermacs--vterm-last-check-point nil
+ "Store the last position checked in the vterm buffer.")
+
+
+(defvar-local aidermacs-vterm-check-interval 0.2
+ "Interval in seconds between checks for command completion in vterm.")
+
+
(defcustom aidermacs-vterm-multiline-newline-key "S-<return>"
"Key binding to enter a newline without sending in vterm."
:type 'string
@@ -58,31 +67,33 @@ pattern to match. If the finish sequence is detected,
store the output via
(condition-case nil
(vterm--render)
(error nil)))
-
+ ;; Get current prompt point
(let* ((prompt-point (condition-case nil
(vterm--get-prompt-point)
(error (point-max))))
- ;; Only do these expensive operations if we have a new prompt
- (has-new-prompt (< start-point prompt-point)))
+ ;; Only check if we have a new prompt or haven't checked this
position yet
+ (last-check (or aidermacs--vterm-last-check-point start-point))
+ (should-check (> prompt-point last-check)))
- (when has-new-prompt
- ;; Only search for boundaries when we have a new prompt
+ ;; Update the last check point
+ (setq aidermacs--vterm-last-check-point prompt-point)
+
+ (when should-check
(let* ((seq-start (or (save-excursion
(goto-char prompt-point)
(condition-case nil
(search-backward "\n" nil t)
(error nil)))
(point-min)))
- ;; Only get the prompt line, not the whole sequence
- (prompt-line (buffer-substring-no-properties
- seq-start
- (min (+ seq-start 200) (point-max)))))
+ ;; Only get the prompt line, not the whole sequence (limit to
200 chars)
+ (prompt-line-end (min (+ seq-start 200) (point-max)))
+ (prompt-line (buffer-substring-no-properties seq-start
prompt-line-end)))
+ ;; If we found a shell prompt
(when (string-match-p expected prompt-line)
(let ((output (buffer-substring-no-properties start-point
seq-start)))
(aidermacs--store-output (string-trim output)))
- (set-process-filter proc orig-filter)
- t)))))))
+ (set-process-filter proc orig-filter))))))))
(defun aidermacs--vterm-output-advice (orig-fun &rest args)
"Capture vterm output until the finish sequence appears.
@@ -97,25 +108,24 @@ after each output chunk, reducing the need for timers."
;; Simplified pattern that just looks for a shell prompt
(expected "^[^[:space:]]*>[[:space:]]")
(orig-filter (process-filter proc)))
- ;; Set our temporary process filter.
+
+ ;; Initialize tracking variables
+ (setq-local aidermacs--vterm-last-check-point nil)
+
+ ;; Set our temporary process filter
(set-process-filter
proc
(lambda (proc string)
- ;; Call the original filter.
+ ;; Call the original filter
(funcall orig-filter proc string)
- ;; Check immediately after receiving output
- (when (aidermacs--vterm-check-finish-sequence-repeated proc
orig-filter start-point expected)
- (when (timerp aidermacs--vterm-active-timer)
- (cancel-timer aidermacs--vterm-active-timer)
- (setq aidermacs--vterm-active-timer nil))
- (set-process-filter proc orig-filter))
-
- ;; If we haven't found it yet, set up a timer with adaptive
frequency
+ ;; Only set up a timer if we don't already have one
(unless aidermacs--vterm-active-timer
+ ;; Set up a timer to check for completion
(setq aidermacs--vterm-active-timer
(run-with-timer
- 0.05 0.05
+ aidermacs-vterm-check-interval
+ aidermacs-vterm-check-interval
(lambda ()
(when (aidermacs--vterm-check-finish-sequence-repeated
proc orig-filter start-point expected)
@@ -140,11 +150,10 @@ BUFFER-NAME is the name for the vterm buffer."
(vterm-buffer-name buffer-name)
(vterm-shell cmd))
(with-current-buffer (vterm-other-window)
+ (setq-local vterm-max-scrollback 1000
+ aidermacs--vterm-active-timer nil
+ aidermacs--vterm-last-check-point nil)
(advice-add 'vterm-send-return :around
#'aidermacs--vterm-output-advice)
- ;; Set a reasonable scrollback limit to prevent memory issues
- (setq-local vterm-max-scrollback 5000)
- ;; Initialize timer variable
- (setq-local aidermacs--vterm-active-timer nil)
;; Set up multi-line key binding
(let ((map (make-sparse-keymap)))
(set-keymap-parent map (current-local-map))
@@ -174,7 +183,8 @@ BUFFER is the target buffer to send to. COMMAND is the
text to send."
"Clean up vterm resources when buffer is killed."
(when aidermacs--vterm-active-timer
(cancel-timer aidermacs--vterm-active-timer)
- (setq aidermacs--vterm-active-timer nil)))
+ (setq-local aidermacs--vterm-active-timer nil))
+ (setq-local aidermacs--vterm-last-check-point nil))
(provide 'aidermacs-backend-vterm)
- [nongnu] elpa/aidermacs 89d323f083 348/466: Update README to include new vterm backend newline key selection, (continued)
- [nongnu] elpa/aidermacs 89d323f083 348/466: Update README to include new vterm backend newline key selection, ELPA Syncer, 2025/03/15
- [nongnu] elpa/aidermacs c07fe5d615 354/466: Fix syntax highlighting when code fence does not have mode, ELPA Syncer, 2025/03/15
- [nongnu] elpa/aidermacs d5a6964d01 357/466: Fix Package-Requires, ELPA Syncer, 2025/03/15
- [nongnu] elpa/aidermacs e9efadeeba 359/466: Update README and Contributors list, ELPA Syncer, 2025/03/15
- [nongnu] elpa/aidermacs e4d8c27892 358/466: Cleanup residuals, ELPA Syncer, 2025/03/15
- [nongnu] elpa/aidermacs 0964906868 366/466: Be more verbose about its args, ELPA Syncer, 2025/03/15
- [nongnu] elpa/aidermacs a24435bc41 368/466: Merge pull request #38 from CeleritasCelery/mode-parser, ELPA Syncer, 2025/03/15
- [nongnu] elpa/aidermacs 01e3a43f20 365/466: Fix URL docstrings, ELPA Syncer, 2025/03/15
- [nongnu] elpa/aidermacs 21ad2f803d 369/466: Fix melpazoid warnings, ELPA Syncer, 2025/03/15
- [nongnu] elpa/aidermacs c9d387c990 376/466: Update Commentary throughout code, ELPA Syncer, 2025/03/15
- [nongnu] elpa/aidermacs a88a79cc9f 375/466: Improve aidermacs--vterm-check-finish-sequence-repeated,
ELPA Syncer <=
- [nongnu] elpa/aidermacs 25af255c54 383/466: Add aidermacs-add-file-to-session, ELPA Syncer, 2025/03/15
- [nongnu] elpa/aidermacs e5495ff362 387/466: Re-introduce aidermacs--comint-output-filter, simplify callback mechanism, ELPA Syncer, 2025/03/15
- [nongnu] elpa/aidermacs 89bfe7d4de 390/466: Refactor and unify aidermacs--send-command, ELPA Syncer, 2025/03/15
- [nongnu] elpa/aidermacs fd786d4d24 396/466: Fix ediff-buffers not populating, ELPA Syncer, 2025/03/15
- [nongnu] elpa/aidermacs 8dc9f024d1 403/466: Fix linting, ELPA Syncer, 2025/03/15
- [nongnu] elpa/aidermacs 50e26da761 417/466: Merge pull request #49 from xplutoy/main, ELPA Syncer, 2025/03/15
- [nongnu] elpa/aidermacs 4ed1f8ddb6 429/466: Merge pull request #51 from milanglacier/refactor/vterm-aider-mode, ELPA Syncer, 2025/03/15
- [nongnu] elpa/aidermacs 451a0bb89f 426/466: refactor: add a minor mode vterm-aider-mode, and remove advices., ELPA Syncer, 2025/03/15
- [nongnu] elpa/aidermacs 01046fcbdd 451/466: Merge pull request #67 from CeleritasCelery/mode-warning, ELPA Syncer, 2025/03/15
- [nongnu] elpa/aidermacs 4d9bff5181 464/466: Breaking change: Refactor ask/architect/code transient logic flow, ELPA Syncer, 2025/03/15