diff options
Diffstat (limited to 'llm-tools-hl.el')
| -rw-r--r-- | llm-tools-hl.el | 98 |
1 files changed, 57 insertions, 41 deletions
diff --git a/llm-tools-hl.el b/llm-tools-hl.el index f4473d3..128a947 100644 --- a/llm-tools-hl.el +++ b/llm-tools-hl.el | |||
| @@ -364,51 +364,67 @@ FILENAME." | |||
| 364 | (push (cons (car sec) (list sec)) grouped)))) | 364 | (push (cons (car sec) (list sec)) grouped)))) |
| 365 | grouped)) | 365 | grouped)) |
| 366 | 366 | ||
| 367 | (defun llm-tools--hl-apply-insert-after (anchor payload content offset) | ||
| 368 | "Insert PAYLOAD after the line identified by ANCHOR (or EOF)." | ||
| 369 | (let* ((line-num (if (string= anchor "EOF") | ||
| 370 | (length content) | ||
| 371 | (+ (llm-tools--hl-anchor-to-line-num anchor) offset))) | ||
| 372 | (idx (1- line-num))) | ||
| 373 | (cons (append (cl-subseq content 0 (1+ idx)) | ||
| 374 | payload | ||
| 375 | (cl-subseq content (1+ idx))) | ||
| 376 | (+ offset (length payload))))) | ||
| 377 | |||
| 378 | (defun llm-tools--hl-apply-insert-before (anchor payload content offset) | ||
| 379 | "Insert PAYLOAD before the line identified by ANCHOR (or BOF)." | ||
| 380 | (let* ((line-num (if (string= anchor "BOF") 1 | ||
| 381 | (+ (llm-tools--hl-anchor-to-line-num anchor) offset))) | ||
| 382 | (idx (1- line-num))) | ||
| 383 | (cons (append (cl-subseq content 0 idx) | ||
| 384 | payload | ||
| 385 | (cl-subseq content idx)) | ||
| 386 | (+ offset (length payload))))) | ||
| 387 | |||
| 388 | (defun llm-tools--hl-apply-delete (range content offset) | ||
| 389 | "Delete lines from (car RANGE) to (cadr RANGE)." | ||
| 390 | (let ((a (+ (llm-tools--hl-anchor-to-line-num (car range)) offset)) | ||
| 391 | (b (+ (llm-tools--hl-anchor-to-line-num (cadr range)) offset))) | ||
| 392 | (cons (append (cl-subseq content 0 (1- a)) | ||
| 393 | (cl-subseq content b)) | ||
| 394 | (- offset (- b a 1))))) | ||
| 395 | |||
| 396 | (defun llm-tools--hl-apply-replace (range payload content offset) | ||
| 397 | "Replace lines from (car RANGE) to (cadr RANGE) with PAYLOAD (nil → '(\"\"))" | ||
| 398 | (let ((a (+ (llm-tools--hl-anchor-to-line-num (car range)) offset)) | ||
| 399 | (b (+ (llm-tools--hl-anchor-to-line-num (cadr range)) offset)) | ||
| 400 | (payload (or payload '("")))) | ||
| 401 | (cons (append (cl-subseq content 0 (1- a)) | ||
| 402 | payload | ||
| 403 | (cl-subseq content b)) | ||
| 404 | (+ offset (- (length payload) (- b a 1)))))) | ||
| 405 | |||
| 367 | (defun llm-tools--hl-apply-one-op (op content offset) | 406 | (defun llm-tools--hl-apply-one-op (op content offset) |
| 368 | "Apply a single OP to CONTENT (list of strings) at the given OFFSET. | 407 | "Apply a single OP to CONTENT (list of strings) at the given OFFSET. |
| 369 | Returns a cons cell (NEW-CONTENT . NEW-OFFSET)." | 408 | Returns a cons cell (NEW-CONTENT . NEW-OFFSET)." |
| 370 | (pcase (hl-op-type op) | 409 | (pcase (hl-op-type op) |
| 371 | ('insert-after | 410 | ('insert-after (llm-tools--hl-apply-insert-after |
| 372 | (let* ((anchor (hl-op-anchor op)) | 411 | (hl-op-anchor op) |
| 373 | (payload (hl-op-payload op)) | 412 | (hl-op-payload op) |
| 374 | (line-num (if (string= anchor "EOF") | 413 | content offset)) |
| 375 | (length content) | 414 | ('insert-before (llm-tools--hl-apply-insert-before |
| 376 | (+ (llm-tools--hl-anchor-to-line-num anchor) | 415 | (hl-op-anchor op) |
| 377 | offset))) | 416 | (hl-op-payload op) |
| 378 | (idx (1- line-num))) | 417 | content |
| 379 | (cons (append (cl-subseq content 0 (1+ idx)) | 418 | offset)) |
| 380 | payload | 419 | ('delete (llm-tools--hl-apply-delete |
| 381 | (cl-subseq content (1+ idx))) | 420 | (hl-op-range op) |
| 382 | (+ offset (length payload))))) | 421 | content |
| 383 | ('insert-before | 422 | offset)) |
| 384 | (let* ((anchor (hl-op-anchor op)) | 423 | ('replace (llm-tools--hl-apply-replace |
| 385 | (payload (hl-op-payload op)) | 424 | (hl-op-range op) |
| 386 | (line-num (if (string= anchor "BOF") | 425 | (hl-op-payload op) |
| 387 | 1 | 426 | content |
| 388 | (+ (llm-tools--hl-anchor-to-line-num anchor) | 427 | offset)))) |
| 389 | offset))) | ||
| 390 | (idx (1- line-num))) | ||
| 391 | (cons (append (cl-subseq content 0 idx) | ||
| 392 | payload | ||
| 393 | (cl-subseq content idx)) | ||
| 394 | (+ offset (length payload))))) | ||
| 395 | ('delete | ||
| 396 | (let* ((range (hl-op-range op)) | ||
| 397 | (a (+ (llm-tools--hl-anchor-to-line-num (car range)) offset)) | ||
| 398 | (b (+ (llm-tools--hl-anchor-to-line-num (cadr range)) offset))) | ||
| 399 | (cons (append (cl-subseq content 0 (1- a)) | ||
| 400 | (cl-subseq content b)) | ||
| 401 | (- offset (- b a 1))))) | ||
| 402 | ('replace | ||
| 403 | (let* ((range (hl-op-range op)) | ||
| 404 | (a (+ (llm-tools--hl-anchor-to-line-num (car range)) offset)) | ||
| 405 | (b (+ (llm-tools--hl-anchor-to-line-num (cadr range)) offset)) | ||
| 406 | (payload (or (hl-op-payload op) | ||
| 407 | '("")))) | ||
| 408 | (cons (append (cl-subseq content 0 (1- a)) | ||
| 409 | payload | ||
| 410 | (cl-subseq content b)) | ||
| 411 | (+ offset (- (length payload) (- b a 1)))))))) | ||
| 412 | 428 | ||
| 413 | (defun llm-tools--hl-apply-ops (ops content) | 429 | (defun llm-tools--hl-apply-ops (ops content) |
| 414 | "Apply a list of OPS to CONTENT (list of strings). | 430 | "Apply a list of OPS to CONTENT (list of strings). |
