llm-tools.el

Opinionated tools for use by a (local) LLM
Log | Files | Refs | LICENSE

commit 5afe962ce78bbf0a0aa334e3c0f84656d337c25a
parent 7da69666fcdcee3fe29768476bc6bcec21dc7b70
Author: Vineet Kumar <git@vineetk.net>
Date:   Mon, 25 May 2026 20:00:44 -0400

split hl-apply-one-op to be not monolithic

Diffstat:
Mllm-tools-hl.el | 98++++++++++++++++++++++++++++++++++++++++++++++---------------------------------
1 file changed, 57 insertions(+), 41 deletions(-)

diff --git a/llm-tools-hl.el b/llm-tools-hl.el @@ -364,51 +364,67 @@ FILENAME." (push (cons (car sec) (list sec)) grouped)))) grouped)) +(defun llm-tools--hl-apply-insert-after (anchor payload content offset) + "Insert PAYLOAD after the line identified by ANCHOR (or EOF)." + (let* ((line-num (if (string= anchor "EOF") + (length content) + (+ (llm-tools--hl-anchor-to-line-num anchor) offset))) + (idx (1- line-num))) + (cons (append (cl-subseq content 0 (1+ idx)) + payload + (cl-subseq content (1+ idx))) + (+ offset (length payload))))) + +(defun llm-tools--hl-apply-insert-before (anchor payload content offset) + "Insert PAYLOAD before the line identified by ANCHOR (or BOF)." + (let* ((line-num (if (string= anchor "BOF") 1 + (+ (llm-tools--hl-anchor-to-line-num anchor) offset))) + (idx (1- line-num))) + (cons (append (cl-subseq content 0 idx) + payload + (cl-subseq content idx)) + (+ offset (length payload))))) + +(defun llm-tools--hl-apply-delete (range content offset) + "Delete lines from (car RANGE) to (cadr RANGE)." + (let ((a (+ (llm-tools--hl-anchor-to-line-num (car range)) offset)) + (b (+ (llm-tools--hl-anchor-to-line-num (cadr range)) offset))) + (cons (append (cl-subseq content 0 (1- a)) + (cl-subseq content b)) + (- offset (- b a 1))))) + +(defun llm-tools--hl-apply-replace (range payload content offset) + "Replace lines from (car RANGE) to (cadr RANGE) with PAYLOAD (nil → '(\"\"))" + (let ((a (+ (llm-tools--hl-anchor-to-line-num (car range)) offset)) + (b (+ (llm-tools--hl-anchor-to-line-num (cadr range)) offset)) + (payload (or payload '("")))) + (cons (append (cl-subseq content 0 (1- a)) + payload + (cl-subseq content b)) + (+ offset (- (length payload) (- b a 1)))))) + (defun llm-tools--hl-apply-one-op (op content offset) "Apply a single OP to CONTENT (list of strings) at the given OFFSET. Returns a cons cell (NEW-CONTENT . NEW-OFFSET)." (pcase (hl-op-type op) - ('insert-after - (let* ((anchor (hl-op-anchor op)) - (payload (hl-op-payload op)) - (line-num (if (string= anchor "EOF") - (length content) - (+ (llm-tools--hl-anchor-to-line-num anchor) - offset))) - (idx (1- line-num))) - (cons (append (cl-subseq content 0 (1+ idx)) - payload - (cl-subseq content (1+ idx))) - (+ offset (length payload))))) - ('insert-before - (let* ((anchor (hl-op-anchor op)) - (payload (hl-op-payload op)) - (line-num (if (string= anchor "BOF") - 1 - (+ (llm-tools--hl-anchor-to-line-num anchor) - offset))) - (idx (1- line-num))) - (cons (append (cl-subseq content 0 idx) - payload - (cl-subseq content idx)) - (+ offset (length payload))))) - ('delete - (let* ((range (hl-op-range op)) - (a (+ (llm-tools--hl-anchor-to-line-num (car range)) offset)) - (b (+ (llm-tools--hl-anchor-to-line-num (cadr range)) offset))) - (cons (append (cl-subseq content 0 (1- a)) - (cl-subseq content b)) - (- offset (- b a 1))))) - ('replace - (let* ((range (hl-op-range op)) - (a (+ (llm-tools--hl-anchor-to-line-num (car range)) offset)) - (b (+ (llm-tools--hl-anchor-to-line-num (cadr range)) offset)) - (payload (or (hl-op-payload op) - '("")))) - (cons (append (cl-subseq content 0 (1- a)) - payload - (cl-subseq content b)) - (+ offset (- (length payload) (- b a 1)))))))) + ('insert-after (llm-tools--hl-apply-insert-after + (hl-op-anchor op) + (hl-op-payload op) + content offset)) + ('insert-before (llm-tools--hl-apply-insert-before + (hl-op-anchor op) + (hl-op-payload op) + content + offset)) + ('delete (llm-tools--hl-apply-delete + (hl-op-range op) + content + offset)) + ('replace (llm-tools--hl-apply-replace + (hl-op-range op) + (hl-op-payload op) + content + offset)))) (defun llm-tools--hl-apply-ops (ops content) "Apply a list of OPS to CONTENT (list of strings).