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