Hi Ihor,

Follow-on patch so that :var injection occurs after :prologue, which means :var 
can now be used on remote hosts if remote host connection occurs via ':prologue 
ssh host"

  -k.

>From 35eefd3a97dea0d3d8742a0d0a7fb5fce1577deb Mon Sep 17 00:00:00 2001
From: Ken Mankoff <mank...@gmail.com>
Date: Mon, 21 Jul 2025 12:49:43 -0400
Subject: [PATCH 4/4] ob-screen: Support :var on remote hosts by :prologue
 after :var

This change supports screen with header :var on remote hosts. It
doesn't yet support :dir /ssh:host: style connections (tramp) but does
support :prologue "ssh host". With the recent addition of ob-screen
supporting :var, the var was injected on the local host, then prologue
executed, meaning var was not seen on the remote host. This patch makes
sure variable injection comes after prologue.
---
 etc/ORG-NEWS          |  6 ++++--
 lisp/org/ob-screen.el | 20 +++++++++++++++-----
 2 files changed, 19 insertions(+), 7 deletions(-)

diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS
index 7091c6b4363..32b88e0b5b3 100644
--- a/etc/ORG-NEWS
+++ b/etc/ORG-NEWS
@@ -259,10 +259,12 @@ Now, an error is thrown.
 
 *** ob-screen now supports :var header arguments
 
-The ~:var~ header arg is now supported.
+The ~:var~ header arg is now supported. Var support also works on remote
+hosts if remote hosts are connected to via :prologue
 
-#+BEGIN_src org
+#+BEGIN_src org :prologue "ssh host"
 ,#+BEGIN_SRC screen :var x=42
+,hostname
 ,echo $x
 ,#+END_SRC
 #+END_src
diff --git a/lisp/org/ob-screen.el b/lisp/org/ob-screen.el
index ca2300a96d6..92088becd65 100644
--- a/lisp/org/ob-screen.el
+++ b/lisp/org/ob-screen.el
@@ -57,13 +57,23 @@ org-babel-execute:screen
   (save-window-excursion
     (let* ((session (cdr (assq :session params)))
            (var-lines (org-babel-variable-assignments:screen params))
-           (socket (org-babel-screen-session-socketname session)))
+           (socket (org-babel-screen-session-socketname session))
+           (prologue (cdr (assoc :prologue params)))
+           (body-no-prologue (if (and prologue (string-prefix-p prologue body))
+                                 (string-trim-left body prologue)
+                               body)))
       (unless socket (org-babel-prep-session:screen session params))
-      (mapcar (lambda (var)
-                (org-babel-screen-session-execute-string session var))
-              var-lines)
+      ;; Send prologue first, if any
+      (when prologue
+        (org-babel-screen-session-execute-string session prologue))
+      ;; Send variable assignments next
+      (mapc (lambda (var)
+              (org-babel-screen-session-execute-string session var))
+            var-lines)
+      ;; Finally, send the rest of the body without prologue
       (org-babel-screen-session-execute-string
-       session (org-babel-expand-body:generic body params)))))
+       session (org-babel-expand-body:generic body-no-prologue params)))))
+
 
 (defun org-babel-prep-session:screen (_session params)
   "Prepare SESSION according to the header arguments specified in PARAMS."
-- 
2.47.2

Reply via email to