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