Function: eca-jobs--render

eca-jobs--render is a natively compiled function defined in eca-jobs.el.

Signature

(eca-jobs--render SESSION BUFFER)

Documentation

Render background jobs for SESSION into BUFFER.

Source Code

;; Defined in /nix/store/jklqzw6pzz6j4jrbv8wy0iwgi7jlrbld-emacs-packages-deps/share/emacs/site-lisp/elpa/eca-20260928.1827/eca-jobs.el
;; Rendering

(defun eca-jobs--render (session buffer)
  "Render background jobs for SESSION into BUFFER."
  (when (buffer-live-p buffer)
    (with-current-buffer buffer
      (let ((inhibit-read-only t)
            (keymap (or (current-local-map) eca-settings-mode-map))
            (jobs (eca--session-jobs session))
            (saved-pos (point)))
        (erase-buffer)
        (insert "\n")
        (insert (propertize "Background Jobs" 'font-lock-face 'eca-settings-heading))
        (insert "\n\n")
        (if (or (null jobs) (seq-empty-p jobs))
            (insert (propertize "No background jobs" 'font-lock-face font-lock-doc-face))
          (let ((groups (eca-jobs--group-by-chat jobs))
                (first-group t))
            (dolist (group groups)
              (let ((chat-label (cadr group))
                    (group-jobs (cddr group)))
                (unless first-group
                  (insert "\n"))
                (setq first-group nil)
                ;; Chat separator
                (insert (propertize (concat "── " chat-label " "
                                           (make-string (max 0 (- 60 (length chat-label) 4)) ?─))
                                   'font-lock-face 'eca-jobs-chat-separator-face))
                (insert "\n")
                ;; Jobs in this group
                (dolist (job group-jobs)
                  (let* ((id (plist-get job :id))
                         (status (plist-get job :status))
                         (label (or (plist-get job :label) ""))
                         (summary (or (plist-get job :summary) id))
                         (elapsed (or (when (string= status "running")
                                       (eca-jobs--elapsed-since (plist-get job :startedAt)))
                                     (plist-get job :elapsed) ""))
                         (exit-code (plist-get job :exitCode))
                         (truncated-label (if (> (length label) 80)
                                              (concat (substring label 0 77) "...")
                                            label))
                         (start (point)))
                    ;; Line 1: status + summary + elapsed + buttons
                    (insert (propertize (eca-jobs--status-emoji status)
                                       'help-echo status))
                    (insert " ")
                    (insert (propertize summary 'font-lock-face 'bold))
                    (insert "  ")
                    (insert (propertize elapsed 'font-lock-face 'shadow))
                    (when (and (string= status "failed") exit-code)
                      (insert "  ")
                      (insert (propertize (format "exit:%s" exit-code)
                                         'font-lock-face 'eca-jobs-status-failed-face)))
                    (insert "  ")
                    (insert (eca-buttonize
                             keymap
                             (propertize "output"
                                         'font-lock-face 'eca-jobs-button-output-face)
                             (lambda ()
                               (when-let* ((s (ignore-errors (eca-session))))
                                 (eca-jobs--view-output-by-id s id)))))
                    (when (string= status "running")
                      (insert "  ")
                      (insert (eca-buttonize
                               keymap
                               (propertize "kill"
                                           'font-lock-face 'eca-jobs-button-kill-face)
                               (lambda ()
                                 (when-let* ((s (ignore-errors (eca-session))))
                                   (eca-api-request-async s
                                                          :method "jobs/kill"
                                                          :params (list :job-id id)
                                                          :success-callback
                                                          (lambda (result)
                                                            (if (plist-get result :killed)
                                                                (message "Job %s killed" id)
                                                              (message "Job %s was not running" id)))
                                                          :error-callback
                                                          (lambda (_err)
                                                            (user-error "Failed to kill job %s" id))))))))
                    (insert "\n")
                    ;; Line 2: command (indented)
                    (insert (propertize (concat "    " truncated-label)
                                       'font-lock-face 'shadow))
                    (insert "\n")
                    (put-text-property start (point) 'eca-job-id id)))))))
        (insert "\n")
        (goto-char (min saved-pos (point-max)))
        (eca-jobs--ensure-timer session buffer)))))