Hi Ihor,

On 2023-02-26 at 08:18 -04, Ihor Radchenko <yanta...@posteo.net> wrote...
> Ken Mankoff <mank...@gmail.com> writes:
>
>> +;; Reuse the variable assignment code from ob-shell
>> +(defalias 'org-babel-variable-assignments:screen
>> +  'org-babel-variable-assignments:shell)
>
> This will work, but you are relying on implementation detail of
> ob-shell.el. A more safe approach would be calling
> org-babel-variable-assignments:LANG depending on the :cmd header arg.
> For :cmd bash - org-babel-variable-assignments:bash, for :cmd fish -
> org-babel-variable-assignments:fish.
>
> To archive this, you can define a full
> org-babel-variable-assignments:screen function that does what I
> described.

Does the attached patch work for you?

  -k.


>From 772f29fb4d45c25eee2214d961ab5db4c58b86dd Mon Sep 17 00:00:00 2001
From: Ken Mankoff <mank...@gmail.com>
Date: Mon, 21 Jul 2025 11:44:24 -0400
Subject: [PATCH] ob-screen.el: support :var header parameter

---
 etc/ORG-NEWS          | 10 ++++++++++
 lisp/org/ob-screen.el | 24 ++++++++++++++++++++++++
 2 files changed, 34 insertions(+)

diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS
index 1a73eea5c91..7091c6b4363 100644
--- a/etc/ORG-NEWS
+++ b/etc/ORG-NEWS
@@ -257,6 +257,16 @@ Now, an error is thrown.
 # We list the most important features, and the features that may
 # require user action to be used.
 
+*** ob-screen now supports :var header arguments
+
+The ~:var~ header arg is now supported.
+
+#+BEGIN_src org
+,#+BEGIN_SRC screen :var x=42
+,echo $x
+,#+END_SRC
+#+END_src
+
 *** Images and files in clipboard can be pasted
 
 Org asks the user what must be done when pasting images and files
diff --git a/lisp/org/ob-screen.el b/lisp/org/ob-screen.el
index ee4efe182f7..ca2300a96d6 100644
--- a/lisp/org/ob-screen.el
+++ b/lisp/org/ob-screen.el
@@ -39,6 +39,7 @@
 (org-assert-version)
 
 (require 'ob)
+(require 'ob-shell)
 
 (defvar org-babel-screen-location "screen"
   "The command location for screen.
@@ -55,8 +56,12 @@ org-babel-execute:screen
   (unless noninteractive (message "Sending source code block to interactive terminal session..."))
   (save-window-excursion
     (let* ((session (cdr (assq :session params)))
+           (var-lines (org-babel-variable-assignments:screen params))
            (socket (org-babel-screen-session-socketname session)))
       (unless socket (org-babel-prep-session:screen session params))
+      (mapcar (lambda (var)
+                (org-babel-screen-session-execute-string session var))
+              var-lines)
       (org-babel-screen-session-execute-string
        session (org-babel-expand-body:generic body params)))))
 
@@ -121,6 +126,25 @@ org-babel-screen-session-write-temp-file
       (delete-matching-lines "^ +$"))
     tmpfile))
 
+(defun org-babel-variable-assignments:screen (params)
+  "Return variable assignments for a screen source block.
+Dispatches to the appropriate shell-specific assignment function
+based on the :cmd header argument."
+  (let* ((cmd (cdr (assq :cmd params)))
+         (shell (or (and cmd (if (listp cmd) (car cmd) cmd)) "sh"))
+         (var-helper
+          (and shell
+               (intern-soft
+                (format "org-babel--variable-assignments:%s" shell)))))
+    (mapcar
+     (lambda (pair)
+       (let ((varname (symbol-name (car pair)))
+             (val (cdr pair)))
+         (if (and var-helper (fboundp var-helper))
+             (funcall var-helper varname val)
+           (format "%s=%s" varname (org-babel-sh-var-to-sh val)))))
+     (org-babel--get-vars params))))
+
 (defun org-babel-screen-test ()
   "Test if the default setup works.
 The terminal should shortly flicker."
-- 
2.47.2

Reply via email to